3

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

比方说,我有一个订单,并希望将该订单标记为完成。 正如我所见,我有两种选择。

    1.
var order _orderRepository.GetById(1); 
order.Finish(); 
_orderRepository.Update(order); 

...其中的变化是坚持在更新调用数据库。

2.

var order _orderRepository.GetById(1); 
var finishedOrder = _orderRepository.Finish(order); 

...其中的变化是坚持在完成调用数据库。

使用其中一种方法是否有优势?什么是DDD这样做的方式?

+0

第一个是正确的方法。 – Jehof

+0

@Jehof我也这么认为,但为什么我应该更喜欢第一个呢? –

+1

原因我认为不是存储库负责将订单标记为已完成。它直到一个命令(当使用CQRS)或一个DomainService来做到这一点 – Jehof

回答

5

您不应该在存储库中对其进行修改。

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

如果您还使其对某些业务逻辑负责,则违反了单一职责原则。

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

它看起来很平常。但第一次违反原则时,这只是微不足道的。但是一个违规通常会导致另一个违规,最终导致另一个应用程序不易维护:)

一个类有混合职责的应用程序也很难导航。每次要更新某个功能时,都必须通过所有层来查找实际逻辑的完成位置。

0

使用应用程序层协调一个或多个域对象的行为,域对象应执行所有状态更改,最后回购应将这些更改持久保存到数据库或存储域的状态的任何位置。

相关问题