我有两个与数据库的连接: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);
}
使用以下命令注册DbContext时:
container.RegisterPerWebRequest<DbContext, MssqlDbContext>()
这意味着你想将它注入DbContext
而不是具体类型。换句话说,使用这种方法,它的消费者将DbContext
作为构造函数参数,而不是MssqlDbContext
。
如果你有两个不同的DbContext实现,两者都有它们独立的数据库模式,那么注入DbContext
是没有意义的。这将是一个Liskov Substitution Principle违规。
取决于DbContext
对消费者来说是无用的,因为它无法访问其ReportPhones
和ReportPhoneDetails
。它只能通过将DbContext
转换回MssqlDbContext
来实现这一点,但这很麻烦且容易出错:可能会注入不兼容的DbContext
实现。
因此,您应该让消费者依赖MssqlDbContext
或MysqlDbContext
并直接使用它们。例如:
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>();
提示:由于两者都有不同的架构,请尝试使用更具功能性的名称。
Mssql
和Mysql
仅描述了技术,而不是存储在这些数据库中的技术。