我正在练习领域驱动设计,为什么不构建一个演示产品目录项目呢?显然 Product
是这里的核心域,但由于我想让项目更有趣,所以我很乐意支持嵌套的 Category
层次结构。换句话说,一个 Category
可以有很多子 Category
。
此外,我想将 Category
与 Product
域分开,并使其成为自己的支持域。
问题:将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
是直截了当的,但您在该表示上没有任何限制。在每个使用的读取模型
中,您可以不同地实现它们:
- 具有父引用的模型树结构
- 带有子引用的模型树结构
- 具有祖先数组的模型树结构
- 具有物化路径的模型树结构
- 具有嵌套集的模型树结构
See more here about implementing tree structures (此链接指向 MongoDB,但这不相关)。
Category Aggregate
只是发出简单的事件,如 ACategoryWasCreated
、ACategoryHasMovedToOtherParent
等等,Read models
只是适应以反射(reflect)这些事件。
我已经实现了这样的树结构,读取端(查询端)的查询非常非常快。您可以选择一个类别中的产品以及所有没有连接的子类别。或者您可以再次构建一个没有连接的类别路径。
关于domain-driven-design - 领域驱动设计 : how to model nested product category hierarchy? 更糟糕的是,如果产品类别是聚合根怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42544256/