asp.net – 在Global.asax方法中将与Autofac注册的组件的相同实
我有一种情况需要手动实例化Application_BeginRequest中的某些对象,这些对象依赖于我在Autofac中注册的一些相同组件.我想使用与使用InstancePerLifetimeScope注册的Autofac相同的组件实例注入我的MVC和WebAPI控制器.我对MVC和Web API的配置按预期工作,组件注册的示例如下所示:
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控制器解析注册组件的相同实例? 解决方法
好吧,我认为你应该尝试将.InstancePerLifetimeScope()改为.InstancePerRequest();
正如Autofac所说的InstancePerLifetimeScope:
因此,当您执行Resolve< MyDbContext>()时,您可能在与控制器不同的Lifetime范围内执行此操作(我想这是因为您正在进行明确的解决方案);这就是为什么你得到一个不同的实例. InstancePerRequest代替:
您的请求的开始阶段已经处于请求阶段,因此您应该在控制器中获取相同的实例.
基于此,您可能也可以使用.InstancePerMatchingLifetimeScope(“myrequest”),但您必须使用(var scope1 = container.BeginLifetimeScope(“myrequest”))手动实现Lifetime范围(如下所示);我觉得不太实际. 显然,我认为您不会在请求范围之外使用这些元素,否则您将获得异常.在这种情况下,您被迫使用MatchingLifetimeScope. 如果您需要更多细节,Autofac guide非常清晰. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – MVC3非顺序隐藏输入索引需要先来吗?
- asp.net-mvc-4 – 尝试从Visual Studio 2012项目目录运行站
- asp.net-mvc – Autofac:解决最内层范围的任何方法?
- asp.net核心中的Request.CreateResponse
- asp.net – MVC 3 htmlhelper的扩展方法来包装内容
- asp.net-mvc-3 – asp.net mvc 3应用程序中的默认sessionSt
- 使用CodeMirror在浏览器中实现编辑器的代码高亮效果
- asp.net-core – 带有JSONP的ASP.NET Core MVC
- asp.net – 通过javascript从代码后面访问变量
- C#_.NetFramework_Web项目_EXCEL数据导出 C#_.N