我越是探索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。而客户是一些聚合根。
请告诉我存储库方法更好。
谢谢。
答案 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查询。