чем больше я изучаю 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.А Клиент - это какой-то совокупный корень.
Пожалуйста, покажите мне, что подход к хранилищу лучше.
Спасибо.