无法获得当前http请求(Autofac 4)的范围?

时间:2016-06-17 23:13:30

标签: asp.net-core autofac asp.net-core-mvc

当HttpContext存在时,如何为当前的http请求获取 ILifetimeScope ?例如。我想从静态扩展方法解析服务。我不想通过BeginLifetimeScope()方法创建范围的新实例。

我花了几个小时没找到解决方案..

1 个答案:

答案 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>();