Jef*_*eff 6 .net domain-driven-design repository repository-pattern
我越是探索DDD和存储库,我就越觉得自己被域服务方法所吸引.
我的直觉中的某些东西并不像存储库(至少在我一直在阅读的示例和文章中)不是单一语句原子这一事实.
using (var customerRepository = GetCustomerRepository())
{
customerRepository.AddCustomerForDelete(someCustomer);
customerRepository.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
有一些我不喜欢的东西.通常,存储库本身成为一个问题,必须维护(它是IDisposable并需要"提交").我似乎并没有抽象出持久性问题.
一个更简单的方法,似乎在我的肠道中更好地是:
GetCustomerService().DeleteCustomer(someCustomer);
Run Code Online (Sandbox Code Playgroud)
这是原子的.没有用于维护,处置或保存更改的存储库实例.如果您真的需要在聚合根目录上的单个操作之外的工作单元支持,请合并某种数据范围支持(类似于TransactionScope):
using(var ds = new DataScope())
{
// both of these happen under the same underlying DbConnection or whatever
GetCustomerService().DeleteCustomer(someCustomer1);
GetCustomerService().DoSomethingElse(someCustomer2);
}
Run Code Online (Sandbox Code Playgroud)
在上述两种情况中,例如,假设它们位于某个业务控制器中,并且用于数据访问的底层机制(位于存储库或服务实现中)是实体框架ObjectContext.而客户是一些聚合根.
请告诉我存储库方法更好.
谢谢.
我想说的是,您只见过存储库模式的幼稚示例。没有任何内容表明存储库应该具有原子方法。
我的方法与您的数据范围方法几乎相同:
using(var uow = UoW.Begin())
{
var customerRepo = new CustomerRepository(uow);
customerRepo.Remove(someCustomer);
uow.Commit();
}
Run Code Online (Sandbox Code Playgroud)
(我的方法基于 Jimmy Nilssons 在他的《应用领域驱动设计和模式》一书中的 NWorkspace 想法)
这样,我可以将不同类型的 UoW 传递到我的存储库。例如,基于 EF4 的 uow 或基于对象的 linq uow,并且仍然在存储库内使用相同的 linq 查询。