具有 ASP.NET MVC 的 Autofac 生命周期范围
Autofac Lifetime Scope with ASP.NET MVC
我是 Autofac 的新手。
我正在尝试将 autofac 与 asp.net mvc 应用程序集成,并按照存储库模式
提供完整的解决方案
以下是我做的配置。
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 abstract完成类型注册class
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);
}
}
}
我的主要问题是:
- 为了避免内存泄漏问题,我们是否需要在 MVC 控制器中定义生命周期范围(如上面 MyController 的 SayHello 操作),或者这对于 MVC 不是必需的?
- 使用 Module 将 Type Registry 委托给各个项目是正确的方法还是有 better/correct 方法?
- 有没有更好的方法在 MyController 中获取 ILifetimeScope 而无需从 Controller 的 Constructor 传递 "ILifetimeScope" 参数?
提前致谢。
我猜您已经查看了 Autofac 文档中的一些示例和解释,例如 how to integrate with MVC and how lifetime scopes work 所以我将保持简短:
- 如果不需要,请不要在控制器中创建自己的生命周期范围。每个请求都有自己的生命周期范围 - 您解析的所有内容都在请求范围内或在 per-instance 的基础上,将在请求结束时为您处理。
- 根据您的应用程序的结构,如何注册您的类型并使它们井然有序是非常主观的。基于每个项目的模块是一种(一种好方法)做吧。
- 通常避免在控制器中传递
ILifetimeScope
。 就像任何其他 inversion-of-control/dependency 注入场景一样,只需在控制器的构造函数中获取依赖项。如果您想推迟解析服务(就像您可能不需要它一样),那么 look at things like the Func<T>
relationship that Autofac supports.
我是 Autofac 的新手。 我正在尝试将 autofac 与 asp.net mvc 应用程序集成,并按照存储库模式
提供完整的解决方案以下是我做的配置。
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 abstract完成类型注册class
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);
}
}
}
我的主要问题是:
- 为了避免内存泄漏问题,我们是否需要在 MVC 控制器中定义生命周期范围(如上面 MyController 的 SayHello 操作),或者这对于 MVC 不是必需的?
- 使用 Module 将 Type Registry 委托给各个项目是正确的方法还是有 better/correct 方法?
- 有没有更好的方法在 MyController 中获取 ILifetimeScope 而无需从 Controller 的 Constructor 传递 "ILifetimeScope" 参数?
提前致谢。
我猜您已经查看了 Autofac 文档中的一些示例和解释,例如 how to integrate with MVC and how lifetime scopes work 所以我将保持简短:
- 如果不需要,请不要在控制器中创建自己的生命周期范围。每个请求都有自己的生命周期范围 - 您解析的所有内容都在请求范围内或在 per-instance 的基础上,将在请求结束时为您处理。
- 根据您的应用程序的结构,如何注册您的类型并使它们井然有序是非常主观的。基于每个项目的模块是一种(一种好方法)做吧。
- 通常避免在控制器中传递
ILifetimeScope
。 就像任何其他 inversion-of-control/dependency 注入场景一样,只需在控制器的构造函数中获取依赖项。如果您想推迟解析服务(就像您可能不需要它一样),那么 look at things like theFunc<T>
relationship that Autofac supports.