.net 存储库与域服务

.net 存储库与域服务,.net,domain-driven-design,repository,repository-pattern,.net,Domain Driven Design,Repository,Repository Pattern,我越是探索DDD和存储库,就越觉得自己被吸引到域服务方法上来 我的直觉不喜欢存储库(至少在我阅读的示例和文章中)不是单语句原子的事实 using (var customerRepository = GetCustomerRepository()) { customerRepository.AddCustomerForDelete(someCustomer); customerRepository.SaveChanges(); } 这件事有很多我不喜欢的地方

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

我的直觉不喜欢存储库(至少在我阅读的示例和文章中)不是单语句原子的事实

  using (var customerRepository = GetCustomerRepository()) 
  {
      customerRepository.AddCustomerForDelete(someCustomer);
      customerRepository.SaveChanges();
  }
这件事有很多我不喜欢的地方。通常,存储库本身成为一个问题,必须维护(它是IDisposable的,需要“提交”)。我似乎并没有把持久性问题抽象化

在我看来,一个更简单的方法是:

  GetCustomerService().DeleteCustomer(someCustomer);
它是原子的。没有可用于维护、处置或保存更改的存储库实例。如果您真的需要聚合根上单个操作之外的工作单元支持,请结合某种数据范围支持(类似于TransactionScope):

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

请告诉我存储库方法更好


谢谢。

我想说,您只看到了存储库模式的简单示例。 没有任何东西说存储库应该有原子方法

我的方法与您的datascope方法几乎相同:

using(var uow = UoW.Begin())
{
    var customerRepo = new CustomerRepository(uow);
    customerRepo.Remove(someCustomer);
    uow.Commit();
}
(我的方法基于Jimmy Nilssons《应用领域驱动设计和模式》一书中的工作空间思想)

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

似乎您刚刚用工作单元的存储库方法取代了我的关注点。Roger解决了他的uow的真正关注点:“维护受业务事务影响的对象列表,协调更改的写出和并发问题的解决。”(Fowler)在大多数非平凡的应用程序中,需要解决的是对相关业务对象的事务性更改。在现代ORM支持的数据访问层中,事务性更改不应该由ORM本身协调,因为在大多数情况下,保存的是单个对象/实体图吗?是的,UoW只是一个抽象的ontop o因此,允许不同的UoW实现,例如EF4和Linq针对生产和测试场景反对UoW。但我真的希望消费代码与UoW混在一起吗?我知道我可以用DI将其注入存储库……但消费代码会使事情过度复杂是另一个问题。什么能阻止某人在两个不同的存储库中保存一个实体两次,使用两个不同的UOW(这肯定会与EF OjbectContext冲突)?+1;强烈反对,但我喜欢这个问题
using(var uow = UoW.Begin())
{
    var customerRepo = new CustomerRepository(uow);
    customerRepo.Remove(someCustomer);
    uow.Commit();
}