0

我正在研究多层架构,在 MVC 中支持每个租户的多个数据库。我需要根据登录到数据层的用户创建 DBContext。我应该如何创建通用 DBContext 并根据用户设置连接字符串?

以下是从主机数据库获取连接字符串并将其设置为客户端数据库的代码。(在数据/存储库层)

private static string GetConnectionString()
{
    int tenantId;
    HostDBContext hostContext = new HostDBContext();

    //Get Tenant and set ID to get required connection string
    tenantId = 1; //Get Tenant Id from session

    var tenantDetails = hostContext.TenantDetails.Find(tenantId);

    if (tenantDetails != null)
    {
        return tenantDetails.connectionstring;
    }

    return "default connection string";
}
4

1 回答 1

1

你在正确的轨道上,但它不会是一个通用 DbContext的,只是一个在运行时设置的连接字符串。因此,您希望创建一个DbContext工厂,而不是 GetConnectionString,该工厂需要租户 Id 返回您的新 DbContext("connectionString")。

让我们称之为TenantDbContext

public class TenantDbContext : DbContext
{
    public TenantDbContext(string connectionString) : base(connectionString)
    {
    }
// Or
    public TenantDbContext(int tenantId) : base(GetConnectionString(tenantId))
    {
    }
}

如果使用工厂:

public class TenantDbContextFactory : IDbContextFactory<TenantDbContext, int>
{
    public TenantDbContext Create(int tenantId)
    {
        var connectionString = GetConnectionString(tenantId);
        return new TenantDbContext(connectionString);
    }
    // ... rest of factory
}

public interface IDbContextFactory<TContext, TKey> where TContext :DbContext
{
     TContext Create(TKey key);
}

如果您使用的是依赖注入容器,您还可以将其连接起来以返回TenantDbContext基于租户 ID 的容器。

于 2019-01-03T09:50:37.680 回答