如何注册两个DbContexts?

问题描述 投票:1回答:1

我有两个与数据库的连接: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);
}
c# dependency-injection
1个回答
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仅描述了技术,而不是存储在这些数据库中的技术。

© www.soinside.com 2019 - 2024. All rights reserved.