Репозиторий против доменных служб - PullRequest
6 голосов
/ 20 декабря 2010

чем больше я изучаю DDD и репозитории, тем больше я чувствую себя привлеченным к подходу доменных сервисов.

Что-то в моей интуиции не нравится, что репозиторий (по крайней мере в примерахстатьи, которые я читал) - это не одно атомное утверждение.

  using (var customerRepository = GetCustomerRepository()) 
  {
      customerRepository.AddCustomerForDelete(someCustomer);
      customerRepository.SaveChanges();
  }

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

Гораздо более простой подход, который, кажется, лучше подходит мне в живот:

  GetCustomerService().DeleteCustomer(someCustomer);

Это атомарно.Нет экземпляра репозитория для обслуживания, удаления или сохранения изменений.И если вам ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО нужна поддержка единиц работы вне одной операции в объединенном корне, включите некоторую поддержку области данных (сродни TransactionScope):

 using(var ds = new DataScope())
 {
     // both of these happen under the same underlying DbConnection or whatever
     GetCustomerService().DeleteCustomer(someCustomer1);
     GetCustomerService().DoSomethingElse(someCustomer2);
 }

В обоих вышеприведенныхВ качестве примера, предположим, что они находятся в каком-то бизнес-контроллере, а базовый механизм (расположенный внутри реализации репозитория или службы) для доступа к данным представляет собой Entity Framework ObjectContext.А Клиент - это какой-то совокупный корень.

Пожалуйста, покажите мне, что подход к хранилищу лучше.

Спасибо.

1 Ответ

2 голосов
/ 20 декабря 2010

Я бы сказал, что вы видели только наивные примеры шаблонов хранилища.Ничто не говорит о том, что в хранилище должны быть атомарные методы.

Мой подход в значительной степени идентичен вашему подходу к датоскопу:

using(var uow = UoW.Begin())
{
    var customerRepo = new CustomerRepository(uow);
    customerRepo.Remove(someCustomer);
    uow.Commit();
}

(Мой подход основан на идеях Джимми Нильссона NWorkspaceего книга «Применение управляемого доменным дизайном и шаблонов»

Таким образом, я могу передавать различные типы UoW в свои репозитории.например, на основе UOW на основе EF4 или на основе ссылок на объекты на основе UOW, и при этом все еще используются те же запросы LINQ внутри хранилищ.

...