CQRS - 如何定义具有聚合关系的实体?

CQRS - how to define Entity which are with aggregation relationship?

假设我有一些 Brand,每个 Brand 都有一些 Product。当定义实体遵循 CQRS 模式时,将 List<Product> 作为 Brand 的字段是好的做法吗?或者一个实体不应该持有另一个实体,我需要定义另一个实体 BrandProductRelationship?

public class Brand {
    private String id;
    private String name;
    private List<Product> products;
}

public class Product {
    private String id;
    private String name;
}

如果是这样,在定义品牌创建事件时,看起来我需要将 List<Product> 作为参数传递,这看起来很复杂。

public class BrandCreated implements Event {
    public Brand apply() {
        return new Brand(id, name, products);
    }
}

包含其他实体的实体是可以的,前提是它们都是同一一致性边界的一部分。

故事与 聚合 不同;您通常不希望有两条不同的路径来修改单个特定实体的状态,因此不鼓励让一个聚合包含另一个聚合。在这种情况下,您通常会让一个聚合包含一个 标识符 ,可用于查找另一个聚合。

public class Brand {
    private String id;
    private String name;
    private List<String> productsIds;
}

更好;但它演示了 primitive obsession。在领域驱动设计中,实体更有可能使用领域模型本身的值来表达。

public class Brand {
    private Identifier<Brand> id;
    private Name name;
    private List<ProductId> productsIds;
}

甚至

public class Brand {
    private Identifier<Brand> id;
    private Name name;
    private ProductCatalog catalog;
}