儿童AggregateRoots的一个方面对我来说并不是百分之百清楚。我也没有通过谷歌找到完整的例子。
假设我有一个AggregateRoot“客户”。客户可以拥有多个项目。
我已经了解到,我只有一个AggregateRoot“客户”和项目是没有根,到目前为止还不错。
public class Customer : AggregateRoot
{
private List<Project> _projects { get;set; }
public void AddProject(Guid id, string name, int budget)
{
?
}
}我有几个小问题。
亲切的问候
发布于 2017-01-31 12:10:17
Project是聚合(只是没有根)还是POCO类?
当您在添加一个ID时,它看起来就像一个实体。
我有一个业务规则,即每个客户的项目都有一个独特的名称。在客户内部还是项目内部,这条业务规则在哪里?
聚合的存在是为了在其内部强制一致性和不变量,因此每个客户的唯一性概念必须存在于Customer中。当有人试图向Project添加Customer时,需要强制执行这个规则,而且只有Customer知道它有哪些其他项目。
我的命令名为"AddProject“并存在于客户名称空间中,还是"CreateProject”,并存在于项目名称空间中?
与上面一样,这个逻辑需要驻留在Customer中,以便对项目名称强制执行唯一性的业务规则。
发布于 2017-01-31 13:03:42
Project是聚合(只是没有根)还是POCO类?
它既是一个实体,也是一个波科。POCO仅仅意味着您的类是裸金属C#,而不受数据访问或基础设施库之类的污染。总根也是麻烦事。
Project不是AR,因为它已经生活在客户AR下。
我有一个业务规则,即每个客户的项目都有一个独特的名称。在客户内部还是项目内部,这条业务规则在哪里?
“每个客户”明确表示客户范围内的不变量,因此它涉及客户聚合。在这种情况下,聚合不变量由聚合根类Customer强制执行。
我的命令名为"AddProject“并存在于客户名称空间中还是"CreateProject”,并存在于项目名称空间中,然后在后台加载客户聚合并在客户聚合上执行"AddProject“
首先,不要混淆名称空间和域模型设计。在确定哪个域对象具有哪个方法时,名称起搏并不真正起作用。实际上,看到带有单个名称空间的整个域层是很常见的。
名称空间或多或少是代码组织的模糊反映,不是组织本身的。
话虽如此,我已经看到了命令的实现
或
此外,由于命令是每个聚合的,因此为每个聚合添加一个子命名空间是有意义的。
具体来说,这意味着
YourApplication.Application.Commands[.Customer].AddProject
或
YourApplication.Domain.Commands[.Customer].AddProject
发布于 2017-01-31 10:27:11
聚合根不应该包含另一个聚合根。因此,Project应该只是一个具有客户聚集根的实体。至于规则,显然我会把它放在项目级别,因为为了检查这条规则,您需要访问单个客户内部的其他项目,这不应该是Project实体的责任,因为它不应该“知道”其他实体如何保存或引用该规则。
https://stackoverflow.com/questions/41954698
复制相似问题