我有两个数据库连接: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);
}
答案 0 :(得分:1)
使用以下方法注册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
仅描述了该技术,而在这些数据库中存储了什么。