如何解决Autofac InstancePerHttpRequest
我在Global.asax.cs中注册了这样的组件:
ContainerBuilder builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterType().As().InstancePerHttpRequest(); IContainer container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); // This is where my error happens, not sure why? var workContext = container.Resolve();
WebWorkContext
类:
public class WebWorkContext : IWorkContext { // Left out other code }
IWorkContext
接口:
public interface IWorkContext { // Left out other code }
我得到的错误是:
从请求实例的作用域中看不到具有匹配“httpRequest”的标记的作用域。 这通常表示注册为每HTTP请求的组件正被SingleInstance()组件(或类似场景)重新请求。在Web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖,永远不会从容器本身请求。
我如何让它工作? 这就是为什么我这样想是因为工作上下文处理诸如获取当前客户等的东西。
还有一些问题。 一次注册是明智/最佳做法吗? 我需要在另一个阶段添加更多组件吗?
标记为InstancePerHttpRequest
注册应该从在每个HTTP请求期间创建和处置的特定嵌套生命周期范围中解析。
如果将IWorkContext
作为构造函数参数添加到其中一个控制器,您将发现注入了一个实例。 在您的代码中,您尝试从根生命周期范围而不是嵌套的“每个请求”生命周期范围中解析您的服务。
如果要在不运行应用程序的情况下测试解析服务,则需要使用与HTTP请求期间创建的标记相同的标记创建生命周期范围。 在MVC 3集成中,生命周期范围被标记为“httpRequest”。
using (var httpRequestScope = container.BeginLifetimeScope("httpRequest")) { Assert.That(httpRequestScope.Resolve(), Is.Not.Null); }
我想我将更新MVC集成以通过API公开公开“httpRequest”标记名称,以便字符串值不需要硬编码。 也可以将自己的ILifetimeScopeProvider
实现传递给AutofacDependencyResolver
以便可以控制ASP.NET运行时之外的生命周期范围的创建。 当没有可用的HTTP请求时,这在unit testing中很有用。
我在WebForms中这样做:
上述就是C#学习教程:如何解决Autofac InstancePerHttpRequest分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
this.RoutingService = ((Global)HttpContext.Current.ApplicationInstance).ContainerProvider.RequestLifetime.Resolve();
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/959280.html