使用ASP.NET MVC实现Autofac生命周期范围

时间:2016-01-06 07:25:44

标签: asp.net-mvc asp.net-mvc-4 autofac ioc-container

我是Autofac的新手。 我正在尝试将autofac与asp.net mvc应用程序集成在Repository模式之后的完整解决方案

以下是我所做的配置。

  

MvcProject.Website.Global.asax.cs

..Application_start() {
  App_Start.AutofacConfig.ConfigureContainer();
}
  

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));
       }
   }

然后,在Application层中,通过扩展Module抽象类

来完成类型注册
  

MvcProject.Application.ApplicationModule.cs

public class ApplicationModule : Module
{
    protected override void Load(Containerbuilder builder)
    {
        builder.RegisterType<MyService>.InstancePerLifetimeScope();
        base.Load(builder);
    }
}

然后,从控制器

  

MvcProject.Website.Controllers.MyController.cs

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);
           }
       }
   }

我的主要问题是:

  1. 为了避免内存泄漏问题,我们是否需要在MVC控制器中定义生命周期范围(如上面的MyController的SayHello操作)或者MVC不是必需的?
  2. 使用Module将Type注册表委托给各个项目是正确的方法还是有更好/更正的方法?
  3. 有没有更好的方法让ILifetimeScope在MyController中,而不从Controller的Constructor传递“ILifetimeScope”参数?
  4. 提前谢谢。

1 个答案:

答案 0 :(得分:2)

我猜你已经查看了Autofac文档,了解了how to integrate with MVChow lifetime scopes work之类的一些示例和解释,所以我会简短地说明一下:<\ n / p>

  • 如果您不必,请不要在控制器中创建自己的生命周期范围。每个请求已经获得了自己的生命周期范围 - 您解决的所有内容范围在请求结束时,您将根据请求或按实例处理。
  • 如何根据应用的结构来注册您的类型并使其保持井井有条。基于每个项目的模块是一种方法(一种好方法)。
  • 通常避免在控制器中传递ILifetimeScope只需将控制器的构造函数中的依赖项与任何其他控制反转/依赖注入方案一样。如果您想推迟解析服务(就像您可能不需要那样),那么look at things like the Func<T> relationship that Autofac supports