假设我们有一个类state
(与用户相关),它具有属性OrderRepository
。我想防止在同一时间内有多个确认订单,所以在我确认任何订单之前我必须检查是否已经确认了它的时间段。
我可以制作两种方法(我知道):
changeState
有一个函数OrderRespository
,它在更改之前搜索冲突的已确认订单,只有在找不到任何内容时才允许它 - 这里的问题是存储库知道更改状态的逻辑。 / p>
Order
被注入Order
,changeState
注入了函数PermitRootLogin
,它将使用该存储库来检查冲突 - 这里的问题是域对象知道的持久性。
什么是正确的方法?
答案 0 :(得分:2)
存储库不负责域不变量。聚合物是。如果没有Aggregate在其自身内部有必要的信息来检查不变量,请尝试质疑您的聚合设计,并可能想出一个新的。
您也可以使用域名服务。作为一个较弱的选项,您还可以将域不变量降级为简单的用例前提条件,并由应用程序服务/命令处理程序检查它。请注意,后两个选项并不能保证域实体在该规则的任何时候都处于一致状态。
答案 1 :(得分:0)
另一种思考方式是从存储库的责任角度出发。在一天结束时,Repository是一个抽象来表示如何处理对象集合,在您的情况下,Orders。
因此,保持集合的一致性和正确状态的规则是有意义的,以便在存储库层表示集合。将存储库注入实体可能是代码气味,某些东西没有被正确建模。我要去找你的第一个版本,但也许你不需要具体说明你的状态变化,而只需将这些规则嵌入到save()
方法中。您可以将更改保存到订单中,如果没有其他同时确认。