DDD - 实体应该创建实体吗?

时间:2017-06-12 23:06:45

标签: domain-driven-design

在我的域中,我可能有一个名为User的实体代表一个人,Tenant代表一个企业。{/ p>

有人可能认为这是一个管理用户,因此,它应该能够注册新用户,在代码方面将基本上转换为3种形式:
- adminUserInstance.CreateUser(newUserDTO);
- tenantInstance.CreateUser(newUserDTO)
- newUserInstace.SelfSave()

由于自我注册而使newUserInstace.SelfSave()成为必需品,其他两个是否有意义?我应该只保留自我注册并转向联盟模式,同一用户可以成为多个租户的一部分吗?

从更广义的角度来说:Questions / Answers应该由Users创建还是自己创建,然后绑定到给定的User?甚至更广泛的术语:实体是否应该拥有创建其他(而非任何其他)实体的知识,或者实体应该能够创建自己并拥有“请求者”,例如,调用域服务会捆绑他们吗?

2 个答案:

答案 0 :(得分:2)

  

从广义上讲:问题/答案应该由用户创建还是自己创建,然后绑定到给定用户?甚至更广泛的术语:实体是否应该拥有创建其他(而不是任何其他)实体的知识,或者实体应该能够创建自己并拥有“请求者”,例如,调用将它们捆绑起来的域服务?

Udi Dahan的技术指导是你应该总是得到一个实体,然后用它来创建新的实体。 “客户不仅仅是凭空出现。”

也就是说,创建聚合根实体很奇怪;不是“错误的”,但它偏离了通常的调度命令模式到你要修改的聚合。

答案 1 :(得分:2)

Entities可由entities创建,但仅限于同一aggregate内。因此,如果aggregate创建了entity,则entity是嵌套的entity;它不能在aggregate's边界之外引用。您将嵌套entities的创建放在aggregate中,因为aggregate需要强制执行某些不变量,这是您在设计Aggregates时做出的决定。

另一方面,aggregate rootsAR)由客户端代码创建(大多数情况下为Application服务) {{1强制执行它自己的不变量!因此,在PHP代码中,这应该是这样的:

AR
  

newUserInstace.SelfSave()

//somewhere in an Application service function createUser($id, $username, $password) { $user = new User(); //an AR should always be new-able, i.e. with not injected dependencies $user->registerNew($id, $username, $password); //here the invariants are enforced $this->userRepository->addOrSave($user); } 不会“保存”(持久)本身。这是aggregate服务的工作。无论如何,“保存”似乎不是来自你无处不在的语言,你需要一个更合适的名字(“注册”?)。