Как зарегистрировать два DbContexts? - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть два подключения к базе данных: 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());
    }
}

и сделать DI в контейнере ioc:

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

как я могу сделать то же самое для MysqlDbContext to? например:

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

1 Ответ

0 голосов
/ 03 сентября 2018

Когда вы регистрируете 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 описывает только технологию, а не , что хранится в этих базах данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...