领域驱动的设计可以对引用/嵌入实体的对象进行估价


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从我的基础设施映射到一个实际的领域模型时,如果我想说返回轮辋,我将如何映射轮辋,换句话说,我将从车轮构造一个类型为轮辋的对象?它是像public static function fromNative()那样的静态函数吗;

注:

更具体地说,当我构造值对象时,你可能会注意到,我将对象设置为array的本机类型,这样我就从ODM中删除了映射责任,这是一个好的做法,还是应该将该责任留给ODM

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

但是,如果轮辋和橡胶是值对象,则可以使用复合车轮值对象。

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