UnitOfWork vs соединение с базой данных - PullRequest
3 голосов
/ 19 апреля 2011

В настоящее время я создал реализацию UnitOfWork, которая оборачивает как соединение с базой данных, так и транзакцию.

using (var uow = UnitOfWorkFactory.Create())
{
    // do db operations here through repositories

   uow.SaveChanges();
}

Откат будет вызван, если SaveChanges не был вызван до того, как Uow будет удален.

Является ли плохой выбор дизайна, чтобы позволить uow обрабатывать как соединение, так и транзакцию?

Допустим, у меня есть веб-сайт ASP.Net MVC, где большинство действий просто извлекают информацию избаза данных.Есть ли снижение производительности за создание / принятие транзакций, которые на самом деле ничего не делают в базе данных?

Ответы [ 3 ]

4 голосов
/ 19 апреля 2011

Если вы хотите реализовать UoW, тогда SaveChanges должно быть единственным местом, где будет использоваться соединение и транзакция.UoW просто соберет все команды, которые должны быть выполнены, и выполнит их в транзакции при вызове SaveChanges.

0 голосов
/ 20 апреля 2011

Вы внедрили Единицу работы самостоятельно (я предполагаю, что вы сделали). Изучите использование ADO.NET EF с шаблоном Repository.

Существует большой лагерь, который считает, что любая операция с базой данных должна быть включена в транзакцию. Вы должны обязательно обернуть любые вставки / обновления / удаления в транзакции.

При этом оберните любой объект базы данных, который реализует IDisposable, в блок использования.

0 голосов
/ 19 апреля 2011

UoW зависит от домена. У меня была более или менее та же самая реализация, которую вы используете, пока кто-то не указал на это, поскольку доступ к базе данных не должен действительно влиять на ваш домен.

Так что я в итоге разделил обязанности. Поскольку мой UoW использует репозитории, которые требуют подключения к базе данных, мне все равно требуется подключение.

Так что для случаев, когда мне не требуется UoW, у меня будет это:

using (DatabaseConnectionFactory.Create()) { ... }

Для транзакции:

using (var connection = DatabaseConnectionFactory.Create().BeginTransaction()) 
{
    // do stuff

    connection.CommitTransaction();
}

Если мне требуется UoW (обычно с транзакцией ):

using (var connection = DatabaseConnectionFactory.Create().BeginTransaction())
using (var uow = UnitOfWorkFactory.Create())
{
    // do stuff

    connection.CommitTransaction();
}

НТН

...