我的问题很简单,在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应该是关于对象互动的任何帮助?< / p>
答案 0 :(得分:2)
我的建议是传入实际的Wheel对象。原因是将来如果你想让addWheel函数在将它添加到Car之前检查轮子的某些属性,你会希望轮子可以这样做。此外,这将允许您立即使用Car类中的Wheel对象。如果您只是传入ID,那么您必须在数据库中查找它(假设ID是针对数据库的),然后才能在Car类中与它进行交互。 ID本身与您的Car类无关,因为它只是持续存在的轮子。
答案 1 :(得分:2)
这不是一个简单的问题。如果看一下红皮书,Vaughn Vernon鼓励我们通过id引用聚合,但只能聚合!如果wheel是一个实体,那么你必须将它作为对象传递。
这里最困难的部分是将聚合与entites分开,为此你必须知道你在聚合中得到了什么不变量。
以下是为什么应该通过ID引用聚合的几个原因:
当你必须重新构建聚合时,你还必须加载所有引用的聚合,如果对象图很大,那么你的聚合的每次加载都可能非常慢。你可以通过使用延迟加载来解决这个问题,但是你会遇到另外一个问题,我不会在这里讨论。
存储聚合时,您还必须检查引用的聚合是否未更改,因此您还必须存储它们,或者只是默认存储每个引用的聚合,这实际上是不明智的。
通过一次存储少量聚合,由于您的域的协作性质,您可能会遇到并发问题。这样应用程序甚至可以变得无法使用
但是,有时很难通过ID引用所有聚合,这取决于您的域。