领域驱动设计可以重视对象引用/嵌入实体
Domain driven design can value objects reference / embed an entity
我在理解 ddd 值对象时遇到了一个小问题,所以我的领域提出了几个问题,我真的需要帮助解决它们,
第一个问题:
假设我有一个 car
实体和 wheel
值对象 wheel
有两个实体,它们是 rubber
和 rims
所以问题轮子里面可以有实体吗?
示例:
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 中创建。有时可能需要自定义映射,具体取决于它的复杂程度。我绝对会避免将任何服务于基础架构问题的方法添加到域对象中。
我在理解 ddd 值对象时遇到了一个小问题,所以我的领域提出了几个问题,我真的需要帮助解决它们,
第一个问题:
假设我有一个 car
实体和 wheel
值对象 wheel
有两个实体,它们是 rubber
和 rims
所以问题轮子里面可以有实体吗?
示例:
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 中创建。有时可能需要自定义映射,具体取决于它的复杂程度。我绝对会避免将任何服务于基础架构问题的方法添加到域对象中。