Репозиторий с Ninject и расширением Ninject Factory. Потерять волшебные струны?

У меня есть приложение, которое использует общий шаблон репозитория для доступа к данным. Поскольку приложение требует использования нескольких разных баз данных, я реализовал фабрику репозитория с помощью расширения Ninject Factory Extension. Это позволяет мне создавать репозитории для различных баз данных по запросу. Я просто передаю DBContext фабрике следующим образом:

    private readonly IRepository database1;
    private readonly IRepository database2;

    public MembershipService(IRepositoryFactory repositoryFactory)
    {
        this.database1 = repositoryFactory.CreateRepository(new Context("Database1"));
        this.database2 = repositoryFactory.CreateRepository(new Context("Database2"));
    }

Что раздражает в этом коде, так это строка, необходимая для создания контекста. Строки «База данных1» и «База данных2» в приведенном выше примере. Когда приведенный выше код используется много-много раз на протяжении всего проекта, слишком просто простая опечатка может вызвать серьезные проблемы.

Как я могу исправить эту ситуацию? Следует ли мне создать фабрику контекста? Для этого все равно потребуется имя базы данных. Могу я как-нибудь использовать Enums? Я подбрасывал кучу идей, но ничего не подходило


person Mark    schedule 04.05.2012    source источник


Ответы (2)


У меня была такая же проблема с моим общим шаблоном репозитория, вот как я ее решил:

http://blog.staticvoid.co.nz/2012/01/multiple-repository-data-contexts-with.html

Это позволяет мне объявлять репозитории определенных типов на основе пространства имен из разных баз данных.

Что касается использования, вы могли бы пойти

public MembershipService(IRepository<User> userRepository, IRepository<AppRole> roleRepository)

где User и AppRole происходят из отдельных DBcontexts

person Not loved    schedule 04.05.2012

Если у вас есть разные типы DbContext для каждой базы данных, вы можете упростить процесс, создав две привязки:

kernel.Bind ‹DatabaseDbContext1> (). ToSelf () .InRequestScope ();

kernel.Bind ‹DatabaseDbContext2> (). ToSelf () .InRequestScope ();

В конструктор репозитория включены оба типа:

общедоступный репозиторий (DbContext1, DbContext2)

Вам не нужно помещать имя строки подключения в конструкторы DBContext. Просто назовите каждую строку подключения так же, как каждое имя DbContext. Остальное сделает EntityFramework.

person Mark Phillips    schedule 02.10.2014