我正在使用ASP.Net Core和AutoFac构建多租户应用程序。每个租户将被分配它自己的数据库(例如TenantA将使用DatabaseA,TenantB将使用DatabaseB)。
我想使用AutoFac来解析在运行时连接到哪个数据库。
我在Startup.cs中进行了设置:
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);
}
此外:
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";
}
}
不幸的是,TenantDbContext总是使用TenantA连接字符串设置。即使我单步执行代码并手动设置tenantKey参数的返回值以便它返回TenantB连接字符串,也会发生这种情况。
我该如何解决这个问题?如何根据当前租户的相应连接字符串解析Autofac并创建DBContext实例?