在DDD中,在哪里放置“查找或创建”类型的逻辑?

时间:2018-03-19 13:15:36

标签: php laravel domain-driven-design

  

要求

在某个用例中我们得到一个字符串......

StringX = "some value"

我们希望得到一个[Object A],其属性[Property X]与此字符串匹配。 如果没有[Object A]匹配该值,则需要创建它(因此标题为find或create)。

创建[对象A]的过程比仅仅向数据库添加条目更复杂。

  

问题

如果这只是找到我可以做的对象的问题:

$objectARepo = new ObjectARepository();
$objectA = $objectARepo->findByStringX($stringX);

但是,可能没有与StringX匹配的ObjectA,需要创建它。

我正在努力决定如何处理这种逻辑。

服务应该这样做吗?但服务不应该用于搜索对象,不是吗?

这样的事情会有意义吗?

$objectAService = new ObjectAService(new ObjectARepository());
$objectA = $objectAService->findOrCreateByStringX($stringX);

1 个答案:

答案 0 :(得分:3)

如果找不到新的聚合,业务逻辑将需要创建新聚合并不常见,因为创建通常需要聚合的所有属性。而对于搜索,它只是其中的一小部分。

现在我们假设需要这样做。我建议它不应该是一个名为findOrCreate()的存储库函数,因为存储库应该只关心持久性而不关心如何创建对象。最好的地方是您调用存储库的服务(通常是应用程序服务)。

$objectA = $this->objectARepo->findByStringX($stringX);
$objectA = $objectA ?? $this->createNewObjectA($stringX);
$this->objectARepo->add($objectA);

createNewObjectA()将包含与为新创建的对象设置默认值相关的逻辑。如果您的聚合很复杂,您可以使用工厂。