• 推荐领域层 中定义实体.

    主构造函数

    • 推荐 总是在主构造函数中初始化子集合.
    • 不推荐 在主构造函数中生成 Guid 键, 应该将其做为参数获取, 在调用时推荐使用 IGuidGenerator 生成新的 Guid 值做为参数.

    无参构造函数

    • 推荐 总是定义 protected 无参构造函数与ORM兼容.

    引用

    • 推荐 总是通过 id 引用 其他聚合根, 不要将导航属性添加到其他聚合根中.

    类的其他成员

    • 推荐 总是将属性与方法定义为 virtual (除了私有方法 ). 因为有些ORM和动态代理工具需要.
    • 推荐 保持实体在自身边界内始终 有效一致.
      • 推荐 使用 private,protected,internal或 setter定义属性, 保护实体的一致性和有效性.
      • 推荐 定义 public, internalprotected internal (virtual)方法在必要时更改属性值(使用非public setters时).

    主键

    • 推荐 总是使用 Id 属性做为聚合根主键.
    • 不推荐 在聚合根中使用 复合主键.
    • 推荐 所有的聚合根都使用 Guid 类型 主键.

    基类

    • 推荐 根据需求继承 AggregateRoot<TKey> 或以下一个审计类 (CreationAuditedAggregateRoot<TKey>, AuditedAggregateRoot<TKey>FullAuditedAggregateRoot<TKey>).

    聚合边界

    • 推荐 聚合尽可能小. 大多数聚合只有原始属性, 不会有子集合. 把这些视为设计决策:
      • 加载和保存聚合的 性能内存 成本 (请记住,聚合通常是做为一个单独的单元被加载和保存的). 较大的聚合会消耗更多的CPU和内存.
      • 一致性 & 有效性 边界.

    聚合根

    实体

    1. {
    2. public virtual Guid IssueId { get; private set; }
    3. public virtual Guid LabelId { get; private set; }
    4. protected IssueLabel()
    5. {
    6. }
    7. public IssueLabel(Guid issueId, Guid labelId)
    8. {
    9. IssueId = issueId;
    10. LabelId = labelId;
    11. }
    12. }