DDD.我应该修改存储库中的实体吗?

Eri*_*k Z 3 domain-driven-design repository-design ddd-repositories repository-pattern

我有一个关于实现DDD和存储库模式的问题.我应该修改存储库中的实体吗?

假设我有一个订单,并希望将该订单标记为已完成.在我看来,我有两个选择.

    1.
var order _orderRepository.GetById(1);
order.Finish();
_orderRepository.Update(order);
Run Code Online (Sandbox Code Playgroud)

...更改在Update调用中持久保存到数据库的位置.

2.

var order _orderRepository.GetById(1);
var finishedOrder = _orderRepository.Finish(order);
Run Code Online (Sandbox Code Playgroud)

...在Finish调用中将更改保留到数据库的位置.

使用一种方法比另一种方法有优势吗?DDD的做法是什么?

jga*_*fin 5

您不应该在存储库中修改它.

原因是存储库负责抽象出持久性(即读取/写入数据存储).

如果您还要对某些业务逻辑负责,那么您违反了单一责任原则.

如果您正在进行自动化测试,那么这也意味着您必须进行集成测试以确保数据库通信/映射正常工作,然后进行单元测试以验证您在其中引入的业务逻辑.

这看起来微不足道.但是,当你第一次违反原则时,这是微不足道的.但是一次违规通常会导致另一种违规行为,最后一种不易维护的应用程序:)

类具有混合职责的应用程序也更难以导航.每次要更新功能时,都必须遍历所有层以查找实际逻辑的完成位置.