.NET Core依赖项注入-许多数据库,一个DbContext

时间:2020-06-16 15:27:36

标签: c# asp.net-core .net-core dependency-injection

我有一个使用Microsoft.Extensions.DependencyInjection中的DI的ASP.NET Core应用程序。该应用程序通过完全相同的接口连接到数量众多的数据库,比如说其中的100个。我想用相同的DbContext将它们全部覆盖,例如ExternalDbContext。它们之间的唯一区别是它们使用的连接字符串。我需要为给定的请求实例化上下文的正确版本。因此,解决链将如下所示:

  1. 用户发出的请求带有一个provider = 'ABCD'参数。
  2. 这被映射到具有ISomeService作为依赖项的Controller中的Action。
  3. 该服务具有方法DoStuff(string provider)
  4. 这是关键部分。 ISomeService需要依赖数据层,但这不能硬依赖注入的ExternalDbContext,因为必须动态解决。我的想法是要有一个IExternalDbContextFactory,而该IServiceProvider可能需要GetExternalDbContext(string provider)。该工厂将有一种方法ExternalDbContext,我将使用注入的服务提供商来解析正确的ExternalDbContexts

要实现这一点,我必须以一种允许我基于字符串参数从IServiceProvider解析它们的方式注册ExternalDbContext。出于显而易见的原因,我不想从AddDbContext继承100个不同的无用标记类,然后独立注册它们。另外,我还是希望以某种方式使用方便的UIView方法。

显然,我可以完全构建自己的解析基础结构,但是我宁愿重用现有的解决方案,也不愿花几天时间为该特定用例编写和测试样板。

1 个答案:

答案 0 :(得分:2)

您可以使用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并检查请求参数。