对象与 ddd 中的 Object_id 注入
Object vs Object_id injection in ddd
我的问题很简单,在 ddd 环境中注入 object
本身或 object identifier
什么是最好的?
澄清问题的简单示例
选项 1:
class Car{
public function addWheel(Wheel $wheel){}
}
选项 2:
class Car{
public function addWheel(WheelId $wheel_id){}
}
哪个选项更好?因为每次我决定使用 wheel_id
我都觉得我会 PI
它是 reference
或 embed
并且在 DDD 中它应该是关于对象交互的任何帮助?
我的建议是传入实际的 Wheel 对象。原因是将来如果您希望 addWheel 函数在将轮子添加到 Car 之前检查轮子的某些属性,您将希望轮子可用以执行此操作。此外,这将允许您立即在您的 Car class 中使用 Wheel 对象。如果您只是传递 ID,那么您必须先在数据库中查找它(假设 ID 是针对数据库的),然后才能在 Car class 中与它交互。 ID 本身与您的汽车无关 class,因为它只是为了车轮的持久性。
这不是一个简单的问题。如果查看红皮书,Vaughn Vernon 鼓励我们通过 id 引用聚合,但仅限于聚合!如果 wheel 是一个实体,那么你必须将它作为对象传递。
这里最困难的部分是将聚合与实体分开,为此您必须知道聚合中有哪些不变量。
以下是应按 ID 引用聚合的几个原因:
当你必须重构聚合时,你还必须加载所有引用的聚合,如果对象图很大,那么你的聚合的每次加载都会非常慢。你可以通过使用延迟加载来克服这个问题,但是你会遇到另一个问题,我不会在这里讨论。
当你存储聚合时,你还必须检查引用的聚合是否没有改变,所以你也必须存储它们,或者默认只存储每个引用的聚合,这在性能上确实不明智.
通过一次存储少量聚合,由于域的协作性质,您可能会遇到并发问题。这样应用甚至会变得无法使用
但是,有时很难通过 ID 引用所有聚合,这取决于您的域。
我的问题很简单,在 ddd 环境中注入 object
本身或 object identifier
什么是最好的?
澄清问题的简单示例
选项 1:
class Car{
public function addWheel(Wheel $wheel){}
}
选项 2:
class Car{
public function addWheel(WheelId $wheel_id){}
}
哪个选项更好?因为每次我决定使用 wheel_id
我都觉得我会 PI
它是 reference
或 embed
并且在 DDD 中它应该是关于对象交互的任何帮助?
我的建议是传入实际的 Wheel 对象。原因是将来如果您希望 addWheel 函数在将轮子添加到 Car 之前检查轮子的某些属性,您将希望轮子可用以执行此操作。此外,这将允许您立即在您的 Car class 中使用 Wheel 对象。如果您只是传递 ID,那么您必须先在数据库中查找它(假设 ID 是针对数据库的),然后才能在 Car class 中与它交互。 ID 本身与您的汽车无关 class,因为它只是为了车轮的持久性。
这不是一个简单的问题。如果查看红皮书,Vaughn Vernon 鼓励我们通过 id 引用聚合,但仅限于聚合!如果 wheel 是一个实体,那么你必须将它作为对象传递。
这里最困难的部分是将聚合与实体分开,为此您必须知道聚合中有哪些不变量。
以下是应按 ID 引用聚合的几个原因:
当你必须重构聚合时,你还必须加载所有引用的聚合,如果对象图很大,那么你的聚合的每次加载都会非常慢。你可以通过使用延迟加载来克服这个问题,但是你会遇到另一个问题,我不会在这里讨论。
当你存储聚合时,你还必须检查引用的聚合是否没有改变,所以你也必须存储它们,或者默认只存储每个引用的聚合,这在性能上确实不明智.
通过一次存储少量聚合,由于域的协作性质,您可能会遇到并发问题。这样应用甚至会变得无法使用
但是,有时很难通过 ID 引用所有聚合,这取决于您的域。