Я хочу знать, как большинство людей имеют дело с шаблоном репозитория, когда он предполагает многократное (иногда транзакционное) обращение к одной и той же базе данных и пытается сделать это эффективно, сохраняя агностицизм базы данных и совместно используя несколько репозиториев.
* 1002Допустим, у нас есть хранилища для трех разных объектов;
Widget
,
Thing
и
Whatsit
.Каждый репозиторий абстрагируется через базовый интерфейс в соответствии с обычными процессами разделения.Базовые интерфейсы будут тогда
IWidgetRepository
,
IThingRepository
и
IWhatsitRepository
.
Теперь у нас есть наш бизнес-уровень или эквивалент (как бы вы это ни называли).На этом уровне у нас есть классы, которые обращаются к различным репозиториям.Часто методы в этих классах должны выполнять пакетные / комбинированные операции, когда задействовано несколько репозиториев.Иногда один метод может использовать другой метод внутренне, в то время как этот метод все еще может быть вызван независимо.Как насчет этого сценария, когда операция должна быть транзакционной?
Пример:
class Bob
{
private IWidgetRepository _widgetRepo;
private IThingRepository _thingRepo;
private IWhatsitRepository _whatsitRepo;
public Bob(IWidgetRepository widgetRepo, IThingRepository thingRepo, IWhatsitRepository whatsitRepo)
{
_widgetRepo = widgetRepo;
_thingRepo= thingRepo;
_whatsitRepo= whatsitRepo;
}
public void DoStuff()
{
_widgetRepo.StoreSomeStuff();
_thingRepo.ReadSomeStuff();
_whatsitRepo.SaveSomething();
}
public void DoOtherThing()
{
_widgetRepo.UpdateSomething();
DoStuff();
}
}
Как мне обеспечить эффективный доступ к этой базе данных и не иметь постоянного потока открытых-close-open-close для соединений и непреднамеренного вызова MSDTS и еще много чего?Если моя база данных является чем-то вроде SQLite, стандартные механизмы, такие как создание вложенных транзакций, по своей сути потерпят неудачу, однако бизнес-уровень не должен заботиться о таких вещах.
Как вы решаете такие проблемы?Предоставляет ли ADO.Net простые механизмы для решения этой проблемы или большинство людей заканчивают тем, что оборачивают свои собственные фрагменты кода вокруг ADO.Net для решения подобных проблем?