【问题标题】:DDD. Should I modify a entity inside a repository?滴滴涕。我应该修改存储库中的实体吗?
【发布时间】:2016-04-28 18:00:00
【问题描述】:

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

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

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

...在 Update 调用中将更改保存到数据库中。

2.

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

...在 Finish 调用中将更改保存到数据库中。

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

【问题讨论】:

  • 第一个是正确的方法。
  • @Jehof 我也这么认为,但为什么我更喜欢第一个而不是另一个呢?
  • 因为我认为不是存储库负责将订单标记为已完成。它取决于命令(使用 CQRS 时)或 DomainService 来做到这一点

标签: domain-driven-design repository-pattern ddd-repositories repository-design


【解决方案1】:

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

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

如果你还让它负责某些业务逻辑,你就违反了单一职责原则。

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

这似乎微不足道。但这只是你第一次违反原则时微不足道的。但是一个违规通常会导致另一个和另一个,最后是一个不容易维护的应用程序:)

类具有混合职责的应用程序也更难导航。每次你想更新一个特性时,你都必须遍历所有层才能找到实际逻辑完成的位置。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2018-06-02
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 2011-05-24
      相关资源
      最近更新 更多