在我的域中,我可能有一个名为User
的实体代表一个人,Tenant
代表一个企业。{/ p>
有人可能认为这是一个管理用户,因此,它应该能够注册新用户,在代码方面将基本上转换为3种形式:
- adminUserInstance.CreateUser(newUserDTO);
- tenantInstance.CreateUser(newUserDTO)
- newUserInstace.SelfSave()
由于自我注册而使newUserInstace.SelfSave()
成为必需品,其他两个是否有意义?我应该只保留自我注册并转向联盟模式,同一用户可以成为多个租户的一部分吗?
从更广义的角度来说:Questions
/ Answers
应该由Users
创建还是自己创建,然后绑定到给定的User
?甚至更广泛的术语:实体是否应该拥有创建其他(而非任何其他)实体的知识,或者实体应该能够创建自己并拥有“请求者”,例如,调用域服务会捆绑他们吗?
答案 0 :(得分:2)
从广义上讲:问题/答案应该由用户创建还是自己创建,然后绑定到给定用户?甚至更广泛的术语:实体是否应该拥有创建其他(而不是任何其他)实体的知识,或者实体应该能够创建自己并拥有“请求者”,例如,调用将它们捆绑起来的域服务?
Udi Dahan的技术指导是你应该总是得到一个实体,然后用它来创建新的实体。 “客户不仅仅是凭空出现。”
也就是说,创建聚合根实体很奇怪;不是“错误的”,但它偏离了通常的调度命令模式到你要修改的聚合。
答案 1 :(得分:2)
Entities
可由entities
创建,但仅限于同一aggregate
内。因此,如果aggregate
创建了entity
,则entity
是嵌套的entity
;它不能在aggregate's
边界之外引用。您将嵌套entities
的创建放在aggregate
中,因为aggregate
需要强制执行某些不变量,这是您在设计Aggregates
时做出的决定。
另一方面,aggregate roots
(AR
)由客户端代码创建(大多数情况下为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
服务的工作。无论如何,“保存”似乎不是来自你无处不在的语言,你需要一个更合适的名字(“注册”?)。