我正在尝试使用DDD指南设计电子商务系统的域模型。我有一种情况,我有2种不同类型的产品。一个产品是"项目"另一个产品是"包装" (组/捆绑项目)。到目前为止,我的域模型看起来像这样
public abstract class Product : IAggregateRoot
{
public string ProductId { get; protected set; }
// Many to Many relationship between Item and Package
protected List<ItemPackageRelationship> ItemPackages => new List<ItemPackageRelationship>();
protected List<Image> Images => new List<Image>();
// Other properties shared between Item and Package
}
public class Item : Product
{
// All properties and methods specific to Item
public void SetImages(List<string> images)
{
// Set images for Item has its own business logic
// Example: number of allowed images, size of image etc
}
}
public class Package : Product
{
// All properties and method related to package
public void SetImages(List<string> images)
{
// Set images for Package has its own business logic
// Exampe: number of allowed images, size of image etc
}
}
所有行为都在Item和Package类中定义,而Product类只具有共享属性。最初我想创建2个完全独立的Aggregate根(Item和Package)而没有Product实体。我需要Product的唯一原因是因为系统中的Unique ProductId。与其他实体(如图像)的所有关系都需要基于ProductId。
我并非100%自信我的设计是正确的,需要一些输入。仅仅为了共享一些属性而创建一个Base实体是违反任何DDD原则的?你们还有什么建议来改进我的领域模型的设计吗?
非常感谢。
答案 0 :(得分:0)
我认为实体的继承应该由行为驱动,而不是由属性驱动。
换句话说,您应该查看其他业务代码,而不是实体本身。如果你可以看到相对多的地方应该使用Item
和Package
以相同的方式使用iheritence(但并非绝对必要)。如果单一原因是共享唯一标识符,则继承是不合理的。