Dependency injection 如何使用AutoFac和ASP.Net Core为每个用户指定DbContext
我正在使用ASP.NETCore和AutoFac构建一个多租户应用程序。将为每个租户分配其自己的数据库(例如,租户将使用数据库A,租户将使用数据库B) 我想使用AutoFac在运行时解析要连接到哪个数据库 我在Startup.cs中进行了设置:Dependency injection 如何使用AutoFac和ASP.Net Core为每个用户指定DbContext,dependency-injection,asp.net-core,autofac,multi-tenant,dbcontext,Dependency Injection,Asp.net Core,Autofac,Multi Tenant,Dbcontext,我正在使用ASP.NETCore和AutoFac构建一个多租户应用程序。将为每个租户分配其自己的数据库(例如,租户将使用数据库A,租户将使用数据库B) 我想使用AutoFac在运行时解析要连接到哪个数据库 我在Startup.cs中进行了设置: public IServiceProvider ConfigureServices(IServiceCollection services) { var containerBuilder = new ContainerBuilder();
public IServiceProvider ConfigureServices(IServiceCollection services)
{
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<TenantConnectionStringProvider>()
.As<IConnectionStringProvider>()
.WithParameter((paramInfo, componentContext) => paramInfo.Name == "tenantKey",
(paramInfo, componentContext) => userSession2.TenantKey)
.InstancePerLifetimeScope();
services.AddDbContext<TenantDataContext>(options => {
var connectionStringProvider = new TenantConnectionStringProvider(userSession2.TenantKey);
options.UseSqlServer(connectionStringProvider.ConnectionString); });
containerBuilder.Populate(services);
}
不幸的是,TenantDbContext总是使用TenantA连接字符串设置。即使我单步执行代码并手动设置tenantKey参数的返回值以使其返回TenantB连接字符串,也会发生这种情况
我怎样才能避开这件事?如何让Autofac根据当前租户的相应连接字符串解析和创建DBContext实例?您是否欣赏@TravisIllig。我将结束这个问题。
public interface IConnectionStringProvider
{
string ConnectionString { get; set; }
}
public class TenantConnectionStringProvider : IConnectionStringProvider
{
private string _tenantKey;
public TenantConnectionStringProvider(string tenantKey)
{
_tenantKey = tenantKey;
ConnectionString = GetConnectionString(_tenantKey);
}
public string ConnectionString { get; set; }
public string GetConnectionString(string tenantKey)
{
if (tenantKey == "64C15227-8F9E-4AE4-8620-1986F051FB8F")
{
return "TenantA Connection String";
}
return "TenantB Connection String";
}
}