Как настроить несколько классов UnitOfWork для нескольких баз данных?

Я использую Entity Framework (сначала код), репозитории и шаблон единицы работы, как описано здесь: Entity Framework 4 CTP 4 / CTP 5 Общий шаблон репозитория и возможность модульного тестирования

Я также использую StructureMap для управления экземплярами своих объектов, и у меня есть такой код, как этот, связывающий EF dbcontext и единицу работы:

    For<DbContext>().HybridHttpOrThreadLocalScoped().Use<MyDbContext>();
    For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>();

У меня также есть общий Repository<T>, который в настоящее время знает об экземпляре MyDbContext. Теперь мне нужно иметь возможность поддерживать несколько баз данных и, следовательно, несколько DbContexts. Я подумываю о том, чтобы изменить мой IUnitOfWork на IUnitOfWork<T>, где T — это DbContext для использования. Но мой репозиторий также должен знать, какой DbContext использовать, так что мне нужно сделать его дважды общим (например, Repository<TEntity,TDbContext>)?

Каков наилучший и самый простой способ поддержки нескольких баз данных с помощью шаблона UnitOfWork, который я использую?


person ssmith    schedule 01.09.2011    source источник
comment
У вас одинаковая структура БД (одинаковые таблицы и т. д.) для всех баз данных?   -  person Jayantha Lal Sirisena    schedule 01.09.2011
comment
Нет, они совершенно другие.   -  person ssmith    schedule 02.09.2011


Ответы (1)


Это зависит от логики вашего приложения. Собираетесь ли вы вносить изменения в несколько баз данных за одну единицу работы? Если да, вы все равно должны использовать одну единицу работы с фабрикой баз данных для каждой базы данных, доступ к которой осуществляется в рамках этой единицы работы. Фиксация этой единицы работы должна использовать TransactionScope для атомарного внесения изменений во всю базу данных (это может быть немного сложнее).

Если вам всегда нужно вносить изменения только в одну базу данных, вы можете использовать одну общую единицу работы, но вам также необходимо реализовать общую Get на фабрике базы данных. Передача типа контекста в репозиторий не требуется. Переместите логику инициализации в конкретные репозитории, которые знают тип контекста, который они должны использовать, и они будут запрашивать этот контекст у фабрики баз данных.

person Ladislav Mrnka    schedule 01.09.2011
comment
Я не ожидаю, что мне нужно будет что-то делать с несколькими DbContexts. Если я это сделаю, я могу вернуться к своей собственной реализации транзакций и т. Д. Или придумать что-то еще. Но для целей этого вопроса предположим, что этого никогда не происходит. - person ssmith; 02.09.2011