领域驱动设计可以重视对象引用/嵌入实体

Domain driven design can value objects reference / embed an entity

我在理解 ddd 值对象时遇到了一个小问题,所以我的领域提出了几个问题,我真的需要帮助解决它们,

第一个问题:

假设我有一个 car 实体和 wheel 值对象 wheel 有两个实体,它们是 rubberrims 所以问题轮子里面可以有实体吗?

示例:

namespace Domain\ValueObjects;

class Wheel{

    private $rim;

    private $rubber;

    public function __construct(Domain\Models\Rim $rim, Domain\Models\Rubber $rubber){
        $this->rim = $rim->toArray();
        $this->rubber = $rubber->toArray();
    }
}

第二个问题:

当我将 car 从我的基础设施映射到实际域模型时,如果我想说 return 轮辋,我将如何映射轮辋,换句话说,我将如何构建一个对象轮辋类型?它是像 public static function fromNative();

这样的静态函数吗

注:

要更具体地说明问题二,正如您在构造值对象时可能会注意到的那样,我将对象设置为 array 的本机类型,因此我从 ODM 中删除了映射责任,这是一个好的做法还是我应该把这个责任留给 ODM

在回答您的第一个问题时,值对象表示没有标识且只能通过其值进行比较的对象。实体是有身份的,所以即使它们的值相同,但从根本上来说它们仍然是不同的对象。因此,在您的场景中,一旦您将实体包含在值对象中,您就不再拥有值对象,因为您无法仅根据值来比较它。

但是,如果 rim 和 rubber 是值对象,那么有一个复合的 wheel 值对象就可以了。

对于第二个问题,如果您询问如何从您的数据层中创建一个具有值对象的实体,那么我建议您尽可能从 ODM 中创建。有时可能需要自定义映射,具体取决于它的复杂程度。我绝对会避免将任何服务于基础架构问题的方法添加到域对象中。