domain-driven-design - 领域驱动设计 : how to model nested product category hierarchy? 更糟糕的是,如果产品类别是聚合根怎么办?

标签 domain-driven-design cqrs event-sourcing aggregateroot domain-events

我正在练习领域驱动设计,为什么不构建一个演示产品目录项目呢?显然 Product 是这里的核心域,但由于我想让项目更有趣,所以我很乐意支持嵌套的 Category 层次结构。换句话说,一个 Category 可以有很多子 Category

此外,我想将 CategoryProduct 域分开,并使其成为自己的支持域。

问题:将Category 标记为AggregateRoot 对我来说不合适。一个 Category 可以有很多子 Category,它们也是 AggregateRoots?!!我该如何着手建模呢?嵌套产品类别在电子商务现实生活中很常见。


命名空间DL.Demo.Domain.Shared

public abstract class ValueObjectBase<T> : IEquatable<T> 
    where T : ValueObjectBase<T>
{
    public abstract bool Equals(T other);
    public abstract override bool Equals(object obj);
    public abstract override int GetHashCode();
}

public abstract class EntityBase : IEquatable<EntityBase>
{
    public Guid Id { get; private set; }

    protected EntityBase()
    {
        this.Id = Guid.NewGuid();
    }

    // Some Object overrides
}

我实际上从 Entity 中继承了 AggregateRoot,因为我猜只有 Entity 可能是 AggregateRoot

public abstract class AggregateRoot : EntityBase
{
}

命名空间DL.Demo.Domain.Catalog

public class Category : AggregateRoot
{
    public string Name { get; private set; }
    public Guid? ParentCategoryId { get; private set; }
    public CategoryStatus CategoryStatus { get; private set; }
}

有一个嵌套的 AggregateRoot 列表对我来说听起来不合适。如果您不将 Category 标记为 AggregateRoot,您将如何对其进行建模?

我是 DDD 和所有其他相关的很酷的东西(如领域事件、事件溯源等)的新手。如果有经验的人可以告诉我我的方法是否正确,我将不胜感激。

最佳答案

I am new to DDD and all other related cool stuff like Domain Events, Event Sourcing, etc. I will be appreciated if somebody who had experience can tell me if I am going to the right way.

你走对了。

Category 应该是一个 Aggregate root,通过其 ID 引用父类别,这非常好。

嵌套类别是事件溯源的一个很好的候选者,即使没有特殊的不变量需要保护,因为这个层次结构可以在 Read models 中投影的不同模式。尽管 Aggregate 是直截了当的,但您在该表示上没有任何限制。在每个使用的读取模型中,您可以不同地实现它们:

  1. 具有父引用的模型树结构
  2. 带有子引用的模型树结构
  3. 具有祖先数组的模型树结构
  4. 具有物化路径的模型树结构
  5. 具有嵌套集的模型树结构

See more here about implementing tree structures (此链接指向 MongoDB,但这不相关)。

Category Aggregate 只是发出简单的事件,如 ACategoryWasCreatedACategoryHasMovedToOtherParent 等等,Read models 只是适应以反射(reflect)这些事件。

我已经实现了这样的树结构,读取端(查询端)的查询非常非常快。您可以选择一个类别中的产品以及所有没有连接的子类别。或者您可以再次构建一个没有连接的类别路径。

关于domain-driven-design - 领域驱动设计 : how to model nested product category hierarchy? 更糟糕的是,如果产品类别是聚合根怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42544256/

相关文章:

domain-driven-design - DDD - 域服务实现 : Domain or Infrastructure

repository - DDD : Do item counts belong in domain model?

c# - TDD、DDD 和封装

c# - 如何返回验证结果?

c# - EventStore重复提交异常

c# - CQRS,仍然没有完全理解,数据库中保存了什么;(

domain-driven-design - DDD 和 CQRS/ES 不是打破了 DDD 的持久性不可知性吗?

c# - 如何在 C# ASP NET Core 的后台服务中使用调解器?

node.js - 在 NestJS CQRS 配方中处理 "Event Sourcing"的首选方式

domain-driven-design - CQRS + 没有 DDD 的事件溯源