3

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

假设我有一个订单并且想将该订单标记为已完成。当我看到这一点时,我有两个选择。

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

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

2.

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

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

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

4

2 回答 2

5

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

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

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

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

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

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

于 2016-01-22T08:15:34.553 回答
0

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

于 2016-02-06T02:52:34.543 回答