我在理解ddd值对象时遇到了一个小问题,所以我的领域提出了几个问题,我真的需要帮助来解决它们,
第一个问题:
假设我有一个car
实体和wheel
值对象,wheel
有两个实体,即rubber
和rims
,那么问题是允许轮子内部有实体吗?
示例:
namespace DomainValueObjects;
class Wheel{
private $rim;
private $rubber;
public function __construct(DomainModelsRim $rim, DomainModelsRubber $rubber){
$this->rim = $rim->toArray();
$this->rubber = $rubber->toArray();
}
}
第二个问题:
当我将car
从我的基础设施映射到一个实际的领域模型时,如果我想说返回轮辋,我将如何映射轮辋,换句话说,我将从车轮构造一个类型为轮辋的对象?它是像public static function fromNative()
那样的静态函数吗;
注:
更具体地说,当我构造值对象时,你可能会注意到,我将对象设置为array
的本机类型,这样我就从ODM
中删除了映射责任,这是一个好的做法,还是应该将该责任留给ODM
。
在回答您的第一个问题时,值对象表示一个没有身份的对象,只能通过其值进行比较。实体具有同一性,因此即使它们的值相同,它们从根本上来说仍然是不同的对象。因此,在您的场景中,一旦您将实体包含在值对象中,那么您就不再有值对象,因为您无法仅根据值对其进行比较。
但是,如果轮辋和橡胶是值对象,则可以使用复合车轮值对象。
对于第二个问题,如果你问如何在数据层中创建一个具有值对象的实体,那么如果可能的话,我建议你从ODM中创建。有时可能需要自定义映射,这取决于它的复杂程度。我肯定会避免任何为基础设施问题服务的方法添加到域对象中。