Когда вы регистрируете DbContext, используя:
container.RegisterPerWebRequest<DbContext, MssqlDbContext>()
this подразумевает , что вы хотите ввести его как DbContext
, а не как конкретный тип. Другими словами, используя этот подход, его потребители будут иметь DbContext
в качестве аргумента конструктора, а не MssqlDbContext
.
Когда у вас есть две разные реализации DbContext, обе с отдельной схемой базы данных, не имеет смысла внедрять DbContext
. Это было бы нарушением принципа Лискова .
В зависимости от 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
описывает только технологию, а не , что хранится в этих базах данных.