繁体   English   中英

AggregateRoot和儿童

[英]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)
    {
        ?
    }
}

我有一些小问题。

  1. 项目是一个聚合(只是没有根)还是只是一个POCO类?
    • 应用状态以及在事件存储中保存的内容很重要
  2. 我有业务规则,即每个客户的项目都有一个唯一的名称。
    • 这个业务规则在客户内部或项目内部在哪里?
  3. 我的命令是否具有名称“AddProject”并存在于Customer命名空间或“CreateProject”中并存在于Project命名空间中,然后在后台加载客户聚合并在客户聚合上执行“AddProject”?

亲切的问候

项目是一个聚合(只是没有根)还是只是一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM