我有一个使用Microsoft.Extensions.DependencyInjection
中的DI的ASP.NET Core应用程序。该应用程序通过完全相同的接口连接到数量众多的数据库,比如说其中的100个。我想用相同的DbContext将它们全部覆盖,例如ExternalDbContext
。它们之间的唯一区别是它们使用的连接字符串。我需要为给定的请求实例化上下文的正确版本。因此,解决链将如下所示:
provider = 'ABCD'
参数。ISomeService
作为依赖项的Controller中的Action。DoStuff(string provider)
。ISomeService
需要依赖数据层,但这不能硬依赖注入的ExternalDbContext
,因为必须动态解决。我的想法是要有一个IExternalDbContextFactory
,而该IServiceProvider
可能需要GetExternalDbContext(string provider)
。该工厂将有一种方法ExternalDbContext
,我将使用注入的服务提供商来解析正确的ExternalDbContexts
。要实现这一点,我必须以一种允许我基于字符串参数从IServiceProvider
解析它们的方式注册ExternalDbContext
。出于显而易见的原因,我不想从AddDbContext
继承100个不同的无用标记类,然后独立注册它们。另外,我还是希望以某种方式使用方便的UIView
方法。
显然,我可以完全构建自己的解析基础结构,但是我宁愿重用现有的解决方案,也不愿花几天时间为该特定用例编写和测试样板。
答案 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
并检查请求参数。