簡體   English   中英

.NET 核心依賴注入 - 許多數據庫,一個 DbContext

[英].NET Core dependency injection - many databases, one DbContext

我有一個 ASP.NET 核心應用程序,使用來自Microsoft.Extensions.DependencyInjection的 DI。 該應用程序連接到具有完全相同界面的大量數據庫,假設其中有 100 個。 我想用相同的 DbContext 來裝飾它們,比如ExternalDbContext 它們之間的唯一區別是它們使用的連接字符串。 我需要為給定請求實例化正確版本的上下文。 所以分辨率鏈將像這樣 go :

  1. 用戶發出具有provider = 'ABCD'參數的請求。
  2. 這被映射到 Controller 中的一個動作,它有一個ISomeService作為依賴項。
  3. 該服務有一個方法DoStuff(string provider)
  4. 這是關鍵部分。 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.

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