存储库与域服务

时间:2010-12-20 06:53:04

标签: .net domain-driven-design repository repository-pattern

我越是探索DDD和存储库,我就越觉得自己被域服务方法所吸引。

我的直觉中的某些东西并不像存储库(至少在我一直在阅读的示例和文章中)不是单一语句原子这一事实。

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

有一些我不喜欢的事情。通常,存储库本身成为一个问题,必须维护(它是IDisposable并需要“提交”)。我似乎并没有抽象出持久性问题。

一种更简单的方法似乎在我的直觉中更好:

  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);
 }

在上述两种情况中,例如,假设它们位于某个业务控制器中,并且用于数据访问的底层机制(位于存储库或服务实现中)是实体框架ObjectContext。而客户是一些聚合根。

请告诉我存储库方法更好。

谢谢。

1 个答案:

答案 0 :(得分:2)

我会说你只看到了存储库模式的天真例子。 没有任何东西可以说存储库应该有原子方法。

我的方法与您的数据显示方法完全相同:

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

(我的方法基于Jimmy Nilssons NWorkspace在他的“应用领域驱动设计和模式”一书中的想法)

这样,我可以将不同类型的UoW传递给我的存储库。 例如一个基于EF4的uow或linq到基于uow的对象,并且仍然在存储库中使用相同的linq查询。