当HttpContext存在时,如何为当前的http请求获取 ILifetimeScope ?例如。我想从静态扩展方法解析服务。我不想通过BeginLifetimeScope()方法创建范围的新实例。
我花了几个小时没找到解决方案..
答案 0 :(得分:12)
注意:这最初是以issue/question on Autofac交叉发布的,其中有更多上下文。
根据Autofac问题中发布的代码,您基本上可以引用应用程序容器,您可以解析IHttpContextAccessor
,然后可以从中获取当前HttpContext
。从那里你想要解决请求级别的服务并且卡住了。
首先,重要的是要注意 ASP.NET Core中的一个关键区别是它处理请求范围创建,而不是Autofac。实际上,ASP.NET Core几乎可以处理所有内容作为启动解决服务等等。 Autofac支持DI容器接口,但驱动Autofac调用的引擎 - 包括请求范围的创建和存储 - 都是ASP.NET Core。 (你可以看到in the ASP.NET "Hosting" repo where this happens.)。
知道这一点,它可以帮助解决这样的问题 - 你会知道不要查看Autofac代码而是追逐ASP.NET Core中的东西。
您会注意到ASP.NET Core HttpContext
there is a property RequestServices
上的。该属性是ASP.NET Core的请求生命周期范围。因此,如果您需要对HttpContext
中的服务进行简单的解析,则可以使用:
var accessor = _container.Resolve<IHttpContextAccessor>();
var context = accessor.HttpContext;
var resolved = context.RequestServices.GetService<MyService>();
如果您必须拥有特定于Autofac的请求生存期范围,则可以从请求服务中解析ILifetimeScope
。您始终可以从范围/容器中解析当前的生命周期范围,因此您获得的范围将是请求范围。
var accessor = _container.Resolve<IHttpContextAccessor>();
var context = accessor.HttpContext;
var scope = context.RequestServices.GetService<ILifetimeScope>();
var resolved = scope.Resolve<MyService>();