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;
}
假设我有一些 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;
}