domain-driven-design - DDD。我应该修改存储库中的实体吗?

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

我有一个关于实现 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 方式是什么?

最佳答案

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

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

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

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

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

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

关于domain-driven-design - DDD。我应该修改存储库中的实体吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34941567/

相关文章:

design-patterns - Active Record 模式、Repository 模式和可测试性(java 中)

domain-driven-design - 域模型可以知道存储库吗?

design-patterns - 我怎样才能拥有一个遵守开闭原则的行为丰富的域实体?

asp.net-core - DDD 通过多层过滤器

entity-framework - EF4 STE 包含路径....排除路径?

c# - RX : How to concat a Snapshot stream and an Update stream?

c# - 是否有一种通用的 DDD 模式来处理域对象的欠载?

.net - 存储库模式是程序性的,而不是 OOP?

c# - DDD 中的创建日期和创建者放在哪里?

asp.net-mvc - 关注点分离存储库模式和 Entity Framework 3.5