Asp.net-Core

無法獲得目前 http 請求的範圍(Autofac 4)?

  • June 18, 2016

當 HttpContext 存在時,我們如何獲取目前 http 請求的**ILifetimeScope ?**例如,我想從靜態擴展方法中解析服務。我不想通過 BeginLifetimeScope() 方法創建範圍的新實例。

我花了幾個小時並沒有找到解決方案..

注意:這最初是作為Autofac 上的問題/問題交叉發布的,其中有更多上下文。

根據 Autofac 問題中發布的程式碼,您基本上可以引用應用程序容器,您可以IHttpContextAccessor解析HttpContext. 從那裡你想解決請求級服務並被卡住。

首先,重要的是要注意**ASP.NET Core 的一個關鍵區別是它處理請求範圍的創建,而不是 Autofac。**事實上,ASP.NET Core 幾乎可以處理所有事情,包括啟動服務解析等等。Autofac 支持 DI 容器介面,但驅動 Autofac 呼叫的引擎——包括請求範圍的創建和儲存——都是 ASP.NET Core。(您可以在 ASP.NET “Hosting” repo 中看到發生這種情況的地方。)。

知道這一點,它可以幫助解決此類問題 - 您將知道不要查看 Autofac 程式碼,而是在 ASP.NET Core 中查找內容。

您會注意到,**在 ASP.NET CoreHttpContext 上有一個屬性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>();

引用自:https://stackoverflow.com/questions/37891598