![](/img/trans.png)
[英].NET Core 2.1 DbContext ObjectDisposedException Dependency Injection
[英].NET Core dependency injection - many databases, one DbContext
我有一個 ASP.NET 核心應用程序,使用來自Microsoft.Extensions.DependencyInjection
的 DI。 該應用程序連接到具有完全相同界面的大量數據庫,假設其中有 100 個。 我想用相同的 DbContext 來裝飾它們,比如ExternalDbContext
。 它們之間的唯一區別是它們使用的連接字符串。 我需要為給定請求實例化正確版本的上下文。 所以分辨率鏈將像這樣 go :
provider = 'ABCD'
參數的請求。ISomeService
作為依賴項。DoStuff(string provider)
。ISomeService
需要對數據層的依賴,但這不能是對注入的ExternalDbContext
的硬依賴,因為必須動態解決。 我的想法是擁有一個IExternalDbContextFactory
,它又可以采用IServiceProvider
。 該工廠將有一個GetExternalDbContext(string provider)
方法,我將使用注入的服務提供者解析正確的ExternalDbContext
。 為了實現這一點,我必須以允許我基於字符串參數從IServiceProvider
解析它們的方式注冊ExternalDbContexts
。 出於顯而易見的原因,我不想讓 100 個不同的無用標記類繼承自ExternalDbContext
,然后獨立注冊它們。 此外,我更願意以某種方式使用方便的AddDbContext
方法。
我顯然可以完全構建自己的解析基礎架構,但我寧願重用現有的解決方案,也不願花幾天時間為這個特定的用例編寫和測試樣板。
您可以使用AddDbContext
的重載來管理連接字符串,它使您可以訪問IServiceProvider
:
public void ConfigureServices(IServiceCollection services)
{
services
.AddEntityFrameworkSqlServer()
.AddDbContext<ExternalDbContext>((serviceProvider, options) =>
{
var connectionString = serviceProvider.GetService // get service
// which can determine connection string
.GetConnectionString();
options.UseSqlServer(connectionString);
});
}
}
例如,您可以在那里解析IHttpContextAccessor
並檢查請求參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.