builder.Register(c => new MyDbContext()).AsSelf().InstancePerLifetimeScope();
现在我想在我在Application_BeginRequest中实例化的类中使用相同的实例.我尝试了以下方法:
//Tried with MVC controllers DependencyResolver.Current.GetService<MyDbContext>())); AutofacDependencyResolver.Current.ApplicationContainer.Resolve<MyDbContext>())); AutofacDependencyResolver.Current.RequestLifetimeScope.Resolve<MyDbContext>())); //Tried with Web API controllers GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(MyDbContext))
但是没有人能给我我正在寻找的东西,即使是在请求生命周期的后期(即超出BeginRequest).顺便说一句,我需要使用它来使用Web API配置,但我尝试了前3种方法,看看我是否可以获得任何已解析的实例以匹配Autofac注入的内容.
我认为我对Autofac中的生命周期范围的理解是正确的,我的假设是我的应用程序控制器正在解决的实例在子范围内,上述4种方法都没有被指向,但它是模糊的关于他们正在考虑的范围以及他们如何决定,上述每种方法都试图做些什么.什么甚至更模糊的是Autofac自动为最终注入我的控制器的组件创建的生命周期范围以及创建它们的时间.
澄清以上几点是一个很大的好处,但我的主要问题是如何让Autofac在Global.asax中为我的Web API和MVC控制器解析注册组件的相同实例?
解决方法
正如Autofac所说的InstancePerLifetimeScope:
When you resolve the instance per lifetime scope component,you get a single instance per nested scope (e.g.,per unit of work).
因此,当您执行Resolve< MyDbContext>()时,您可能在与控制器不同的Lifetime范围内执行此操作(我想这是因为您正在进行明确的解决方案);这就是为什么你得到一个不同的实例.
InstancePerRequest代替:
Some application types naturally lend themselves to “request” type semantics,for example ASP.NET web forms and MVC applications. In these application types,it’s helpful to have the ability to have a sort of “singleton per request.”
您的请求的开始阶段已经处于请求阶段,因此您应该在控制器中获取相同的实例.
Instance per request builds on top of instance per matching lifetime scope by providing a well-known lifetime scope tag,a registration convenience method,and integration for common application types.
基于此,您可能也可以使用.InstancePerMatchingLifetimeScope(“myrequest”),但您必须使用(var scope1 = container.BeginLifetimeScope(“myrequest”))手动实现Lifetime范围(如下所示);我觉得不太实际.
显然,我认为您不会在请求范围之外使用这些元素,否则您将获得异常.在这种情况下,您被迫使用MatchingLifetimeScope.
如果您需要更多细节,Autofac guide非常清晰.