Эффективный доступ к базе данных при работе с несколькими абстрактными хранилищами - PullRequest
0 голосов
/ 16 июня 2010

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

* 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 для решения подобных проблем?

Ответы [ 2 ]

1 голос
/ 16 июня 2010

Учтите, что ваши абстрактные репозитории могут быть реализованы в любом количестве баз данных: SQLite, Microsoft SQL Server, прямой доступ к файлам и т. Д. - даже если вы знаете, что они из одной базы данных, это не так * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * то, почему необходимо *1003* "Боб" , чтобы попытаться убедиться, что каждый репозиторий можно транзакционализировать относительно других репозиториев., который содержит конкретные реализации ваших репозиториев.Поскольку этот сервис создает конкретные реализации ваших репозиториев, он способен создавать соответствующие транзакции.Затем эта служба будет отвечать за безопасное выполнение UnitOfWork (спасибо, ckramer ) от имени Боба.

1 голос
/ 16 июня 2010

В основном вы хотите использовать UnitOfWork для этого. Я лично использую NHibernat e, потому что их интерфейс ISession - это, по сути, единица работы, поэтому он объединяет все команды и отправляет их в базу данных вместе (есть также дополнительные смарты и отслеживание состояния объекта который поможет с этим). Таким образом, количество дискретных команд, отправляемых в базу данных, будет зависеть от жизненного цикла вашей сессии IS. В веб-контексте я обычно использую Conversation Per Request , что означает, что ISession создается в начале запроса и сбрасывается (отправляется в БД) в конце запроса.

Здесь есть большой потенциал для изменения жизненного цикла сеанса в зависимости от того, нужен ли вам более короткий или более длинный сеанс, и вы также можете использовать транзакции, которые могут иметь отдельный жизненный цикл, если вам нужно.

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