[英]AggregateRoot and Children
有孩子的AggregateRoots的一个方面对我来说并不是100%清楚。 而且我也没有通过谷歌找到完整的例子。
假设我有一个AggregateRoot“Customer”。 客户可以拥有多个项目。
我已经知道我只有一个AggregateRoot“客户”而且项目没有Root,到目前为止一直都很好。
public class Customer : AggregateRoot
{
private List<Project> _projects { get;set; }
public void AddProject(Guid id, string name, int budget)
{
?
}
}
我有一些小问题。
亲切的问候
项目是一个聚合(只是没有根)还是只是一个POCO类?
好吧,它看起来像一个实体,因为你在添加一个ID时传入一个ID。
我有业务规则,即每个客户的项目都有一个唯一的名称。 这个业务规则在客户内部或项目内部在哪里?
骨料的存在是为了加强其内部的一致性和不变性,所以每个客户独特性的概念都有生存的内部Customer
。 当有人尝试向Customer
添加Project
,需要强制执行此规则,并且只有Customer
知道它具有的其他项目。
我的命令是否具有名称“AddProject”并存在于Customer命名空间或“CreateProject”中并存在于Project命名空间中
与上述相同 - 此逻辑需要存在于Customer
内部,以便强制执行项目名称的唯一性业务规则。
项目是一个聚合(只是没有根)还是只是一个POCO类?
它既是实体又是POCO。 POCO只是意味着你的班级是裸机C#而不受数据访问或基础设施库的污染。 聚合根也是POCO。
Project
不是AR,因为它已经存在于客户AR下。
我有业务规则,即每个客户的项目都有一个唯一的名称。 这个业务规则在客户内部或项目内部在哪里?
“每个客户”清楚地表明客户范围内的不变量,因此它涉及客户汇总。 在这种情况下,聚合根类 - Customer
强制实施聚合不变量。
我的命令是否具有名称“AddProject”并存在于Customer命名空间或“CreateProject”中并存在于Project命名空间中,然后在后台加载客户聚合并在客户聚合上执行“AddProject”
首先,不要将名称空间与域模型设计混淆。 在确定哪个域对象具有哪种方法时,命名空间并没有真正发挥作用。 实际上,通过单个命名空间查看整个域层是很常见的。
命名空间或多或少模糊地反映了代码的组织 , 而不是组织本身 。
话虽这么说,我已经看到了命令所在的实现
要么
此外,由于命令是per-Aggregate,因此为每个Aggregate添加子命名空间是有意义的。
具体地说,它意味着类似的东西
YourApplication.Application.Commands[.Customer].AddProject
要么
YourApplication.Domain.Commands[.Customer].AddProject
聚合根不应包含其他聚合根。 所以Project应该只是一个拥有Customer聚合根的实体。 至于规则显然我将它放在项目级别,因为为了检查这个规则,你需要访问单个客户内的其他项目,这不应该是项目实体的责任,因为它不应该“了解”其他实体保存或引用的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.