Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 具有ASP.NET MVC的Autofac生存期范围_Asp.net Mvc_Asp.net Mvc 4_Autofac_Ioc Container - Fatal编程技术网

Asp.net mvc 具有ASP.NET MVC的Autofac生存期范围

Asp.net mvc 具有ASP.NET MVC的Autofac生存期范围,asp.net-mvc,asp.net-mvc-4,autofac,ioc-container,Asp.net Mvc,Asp.net Mvc 4,Autofac,Ioc Container,我是Autofac的新手。 我正在尝试将autofac与asp.net mvc应用程序集成在一个完整的解决方案中,该解决方案遵循存储库模式 以下是我所做的配置 MvcProject.Website.Global.asax.cs MvcProject.Website.App_Start.AutofacConfig.cs 注意:我已将RegisterTypes注册为不同项目中的模块,并从以下主配置文件中绑定它们 public static class AutofacConfig {

我是Autofac的新手。 我正在尝试将autofac与asp.net mvc应用程序集成在一个完整的解决方案中,该解决方案遵循存储库模式

以下是我所做的配置

MvcProject.Website.Global.asax.cs

MvcProject.Website.App_Start.AutofacConfig.cs

注意:我已将RegisterTypes注册为不同项目中的模块,并从以下主配置文件中绑定它们

public static class AutofacConfig
   {
       public static void ConfigureContainer()
       {
           var builder = new ContainerBuilder();
  builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();

           //Register Repository dependencies
           builder.RegisterModule(new RepositoryModule("mssql"));

           //Register Application dependencies
           builder.RegisterModule(new ApplicationModule());

           var container = builder.Build();
           DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
       }
   }
然后,在应用层,通过扩展模块抽象类完成类型注册

MvcProject.Application.ApplicationModule.cs

公共类应用程序模块:模块
{
受保护的覆盖无效负载(Containerbuilder builder)
{
builder.RegisterType.InstancePerLifetimeScope();
基础荷载(建筑商);
}
}
然后,从控制器

MvcProject.Website.Controllers.MyController.cs

公共类MyController:Controller
{
专用ILifetimeScope\u范围;
公共MyController(ILifetimeScope范围)
{
_范围=范围;
}
公共行动结果SayHello()
{
使用(var localscope=\u scope.BeginLifetimeScope())
{
var service=localscope.Resolve();
var viewModel=service.GetMyViewModel();
返回视图(viewModel);
}
}
}
我的主要问题是:

  • 为了避免内存泄漏问题,我们是否需要在MVC控制器中定义生存期范围(如上面MyController的SayHello操作),还是MVC不需要
  • 使用模块将类型注册表委托给各个项目是正确的方法还是有更好/正确的方法
  • 有没有更好的方法可以在MyController中获取ILifetimeScope,而无需从控制器的构造函数中传递“ILifetimeScope”参数
    提前谢谢。

    我猜您已经在Autofac文档中查看了一些示例和解释,例如,因此我将简要介绍:

    • 如果不需要,请不要在控制器中创建自己的生存期范围。每个请求都已经有了自己的生存期范围-您解析的范围为请求或每个实例的所有内容都将在请求结束时为您处理
    • 根据应用程序的结构,如何注册类型并将其组织起来是非常主观的。基于每个项目的模块是一种方法(一种很好的方法)
    • 通常避免在控制器中传递
      ILifetimeScope
      只需在控制器的构造函数中获取依赖项,就像任何其他控制反转/依赖项注入场景一样。如果您想延迟解析服务(比如您可能不需要它),那么

    感谢您的详细回复。感谢您的详细回复。我通读了下面的文章,发现使用lifetimescope来避免内存泄漏是一种很好的方法。所以,我认为它不适用于web请求??您确实希望使用生存期范围。它适用于MVC。只是有了Autofac提供的集成,您就可以放心了。
    public static class AutofacConfig
       {
           public static void ConfigureContainer()
           {
               var builder = new ContainerBuilder();
      builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();
    
               //Register Repository dependencies
               builder.RegisterModule(new RepositoryModule("mssql"));
    
               //Register Application dependencies
               builder.RegisterModule(new ApplicationModule());
    
               var container = builder.Build();
               DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
           }
       }
    
    public class ApplicationModule : Module
    {
        protected override void Load(Containerbuilder builder)
        {
            builder.RegisterType<MyService>.InstancePerLifetimeScope();
            base.Load(builder);
        }
    }
    
    public class MyController : Controller
       {
           private ILifetimeScope _scope;
    
           public MyController(ILifetimeScope scope)
           {
               _scope = scope;
           }
    
           public ActionResult SayHello()
           {
               using (var localscope = _scope.BeginLifetimeScope())
               {
                   var service = localscope.Resolve<MyService>();
                   var viewModel = service.GetMyViewModel();
                   return View(viewModel);
               }
           }
       }