如何使用AutoFac和ASP.Net Core指定每个用户的DbContext

时间:2017-06-29 17:56:09

标签: dependency-injection asp.net-core autofac multi-tenant dbcontext

我正在使用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实例?

0 个答案:

没有答案