gpt4 book ai didi

service - DDD : is it ok to inject a Service into an Entity

转载 作者:行者123 更新时间:2023-12-02 17:43:09 25 4
gpt4 key购买 nike

我有一个 Zone 对象树:

class Zone {
protected Zone $parent;

public function __construct(Zone $parent) {
$this->parent = $parent;
}
}

区域中没有 children 也没有 descendants 属性,因为我想避免在域模型中管理这些关系的痛苦.

相反,域服务在数据库中维护一个闭包表,以将区域映射到其任何级别的所有后代。

现在,我有一个用户,可以为其分配一个或多个区域:

class User {
protected array $zones;

public function assignZone(Zone $zone) {
$this->zones[] = $zone;
}
}

我的问题是,在向用户分配新区域之前,我想检查该区域是否尚未通过其后代之一显式或隐式分配。

因此,我希望我的 Controller 将服务暂时注入(inject)到此方法中,以执行必要的检查:

class User {
protected array $zones;

public function assignZone(Zone $newZone, ZoneService $zoneService) {
foreach ($this->zones as $zone) {
if ($service->zoneHasDescendant($zone, $newZone)) {
throw new Exception('The user is already assigned this zone');
}
}

$this->zones[] = $zone;
}
}

这是一个好的做法吗?如果不是,正确的选择是什么?

最佳答案

There are no children nor descendants property in the Zone, because I want to avoid the pain of managing these relationships in the domain model.

Instead, a domain service maintains a closure table in the database, to map a zone to all its descendants, at any level.

我加了一些强调,因为它看起来有点矛盾。您不希望域中出现“痛苦”,但您可以在域服务中管理闭包表。您需要将服务注入(inject)实体的事实有时表明设计可以改进。

看起来您有一个区域层次结构。这似乎是您域的重要组成部分。区域有父区域和子区域,因此也许您应该相应地对其进行建模。管理关系的痛苦是一种“合理”的痛苦,因为你这样做是为了模型表现力。在这种情况下,域驱动设计。所以区域本身会有类似的内容:

zone->hasDescendant($newZone)

而且您不需要注入(inject)服务。事实上,您根本不需要服务。因为这项服务的唯一原因是维护闭包表。这不是域问题,只是持久性问题。

如果由于某些原因您仍然需要服务,最好将其注入(inject)到 Zone 类中。这样问题就可以更接近其根源得到解决。

关于service - DDD : is it ok to inject a Service into an Entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7475108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com