如何注册两个DbContext?

时间:2018-09-03 12:38:56

标签: c# dependency-injection

我有两个数据库连接:MsSQL和MySQL。对于mssql,我执行以下操作:

public class MssqlDbContext: DbContext
{

    public DbSet<ReportPhone> ReportPhones { get; set; }
    public DbSet<ReportPhoneDetail> ReportPhoneDetails { get; set; }
    public DbSet<Operator> Operators { get; set; }
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new ReportPhoneConfiguration());
        modelBuilder.Configurations.Add(new CompanyPhoneConfiguration());
    }
}

并在ioc容器中制作DI:

public static void WebConfigure(Container container)
{
    container.RegisterPerWebRequest<DbContext, MssqlDbContext>();
    Configure(container);
}

我如何为MysqlDbContext做同样的事情? 例如:

public static void WebConfigure(Container container)
{
    container.RegisterPerWebRequest<DbContext, MysqlDbContext>();
    container.RegisterPerWebRequest<DbContext, MssqlDbContext>();
    Configure(container);
}

1 个答案:

答案 0 :(得分:1)

使用以下方法注册DbContext时:

container.RegisterPerWebRequest<DbContext, MssqlDbContext>()

暗示表示要将其作为DbContext而不是具体类型注入。换句话说,使用这种方法,其使用者将使用DbContext作为构造函数参数,而不是MssqlDbContext

当您有两个不同的DbContext实现(都具有各自的数据库架构)时,注入DbContext毫无意义。那将是Liskov Substitution Principle违规。

依赖DbContext对消费者将毫无用处,因为它无法访问其ReportPhonesReportPhoneDetails。它只能通过将DbContext强制转换回MssqlDbContext来做到这一点,但是麻烦且容易出错:可能已经注入了不兼容的DbContext实现。

因此,您应该让使用者依赖MssqlDbContextMysqlDbContext并直接使用它们。例如:

public class HomeController : Controller
{
    private readonly MssqlDbContext context;

    public HomeController(MssqlDbContext context)
    {
        this.context = context;
    }

    // class members here
}

在您的WebConfigure方法中,您应该使用其具体类型注册DbContext实现:

container.RegisterPerWebRequest<MysqlDbContext>();
container.RegisterPerWebRequest<MssqlDbContext>();
  

提示:由于两者都有不同的架构,请尝试提供一个更具功能性的名称。 MssqlMysql仅描述了该技术,而在这些数据库中存储了什么