簡體   English   中英

使用autofac在asp.net核心項目上創建新范圍

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM