[英]Create new scope on asp.net core project using autofac
我正在使用帶有autofac的aspnet核心。 我有兩個單獨的服務作為緩存(從數據庫獲取數據並緩存它們)。我需要創建一個新的范圍,以便聲明為InstancePerLifeTime的dbcontext不會在兩個單例服務之間共享(每個服務必須具有它擁有dbcontext)如何在asp.net核心中獲取IContainer? 我試圖調用containerBuild.Build();
我得到的錯誤是該系統已經構建的容器。
我認為你不需要新的范圍。 據我所知, dbcontext
最佳實踐是dbcontext-per-business operation
。 在Web應用程序的情況下,它是一個Web請求。
在你的情況下,你可以將一些IDbContextFactory
(也是單例)傳遞給這些單例,並在需要時創建新的DbContext
實例。
您可以從構造函數中解析ILifetimeScope
並調用其BeginLifetimeScope
方法。
這不是生命范圍的工作方式。
如果您將某些東西注冊為單例( SingleInstance
),它將從根生存期范圍而不是子范圍中解析。 它的依賴關系_也將從根范圍(容器)而不是子范圍解析。
本文詳細介紹了文檔主題“Captive Dependencies”。
基本上,您不能擁有采用每個請求實例或子生存期范圍依賴關系的單例。 您可以擁有一個單獨的依賴於每個依賴項的單例(只能解析一次 - 來自容器,而不是子范圍 - 然后保持); 或者你可以擁有一個單例,它接受一個每個生命周期范圍的實例組件,並且使用的生命周期范圍將是根容器,從而有效地從你正在消費的東西中創建一個單例。
但是,您真正要問的問題是“如何在ASP.NET Core中獲取容器”,答案也在文檔中,在ASP.NET Core“快速入門(沒有ConfigureContainer)”部分中。
ConfigureServices
方法以返回IServiceProvider
而不是void
ConfigureSerivces
的末尾返回new AutofacServiceProvider(container)
。 文檔中有完整的代碼示例。
它不會幫助您處理更大的問題,但至少您可以獲得容器並進行您想要的實驗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.