将存储库注入域对象或存储库应该了解业务逻辑?

时间:2016-09-29 07:06:12

标签: domain-driven-design ddd-repositories

假设我们有一个类state(与用户相关),它具有属性OrderRepository。我想防止在同一时间内有多个确认订单,所以在我确认任何订单之前我必须检查是否已经确认了它的时间段。

我可以制作两种方法(我知道):

  1. changeState有一个函数OrderRespository,它在更改之前搜索冲突的已确认订单,只有在找不到任何内容时才允许它 - 这里的问题是存储库知道更改状态的逻辑。 / p>

  2. Order被注入OrderchangeState注入了函数PermitRootLogin,它将使用该存储库来检查冲突 - 这里的问题是域对象知道的持久性。

  3. 什么是正确的方法?

2 个答案:

答案 0 :(得分:2)

存储库不负责域不变量。聚合物是。如果没有Aggregate在其自身内部有必要的信息来检查不变量,请尝试质疑您的聚合设计,并可能想出一个新的。

您也可以使用域名服务。作为一个较弱的选项,您还可以将域不变量降级为简单的用例前提条件,并由应用程序服务/命令处理程序检查它。请注意,后两个选项并不能保证域实体在该规则的任何时候都处于一致状态。

答案 1 :(得分:0)

另一种思考方式是从存储库的责任角度出发。在一天结束时,Repository是一个抽象来表示如何处理对象集合,在您的情况下,Orders。

因此,保持集合的一致性和正确状态的规则是有意义的,以便在存储库层表示集合。将存储库注入实体可能是代码气味,某些东西没有被正确建模。我要去找你的第一个版本,但也许你不需要具体说明你的状态变化,而只需将这些规则嵌入到save()方法中。您可以将更改保存到订单中,如果没有其他同时确认。