我对实现DDD和存储库模式有疑问。 我应该修改存储库中的实体吗?
假设我有一个订单,并希望将该订单标记为已完成。 在我看来,我有两个选择。
var order _orderRepository.GetById(1);
order.Finish();
_orderRepository.Update(order);
...在 Update 调用中将更改保留到数据库。
2
var order _orderRepository.GetById(1);
var finishedOrder = _orderRepository.Finish(order);
...在完成调用中将更改保留到数据库。
使用一种方法优于另一种方法是否有优势? DDD的做法是什么?
答案 0 :(得分:5)
您不应在存储库中修改它。
原因是存储库负责抽象出持久性(即读/写数据存储)。
如果您还要对某些业务逻辑负责,那么您违反了单一责任原则。
如果您正在进行自动化测试,这也意味着您必须进行集成测试以确保数据库通信/映射正常工作,然后进行单元测试以验证您在其中引入的业务逻辑。
这看似微不足道。但是,当你第一次违反原则时,这只是微不足道的。但是,一次违规通常导致另一次违规,最后一次申请不易维护:)
类混合职责的应用程序也很难导航。每次要更新某个功能时,都必须通过所有层来查找实际逻辑的完成位置。
答案 1 :(得分:0)
使用应用程序层来协调一个或多个域对象的行为,域对象应该执行所有状态更改,最后,repo应该将这些更改持久保存到数据库或存储域状态的任何位置。