DDD中的实体继承

时间:2017-12-28 19:16:26

标签: c# entity-framework domain-driven-design

我正在尝试使用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原则的?你们还有什么建议来改进我的领域模型的设计吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

我认为实体的继承应该由行为驱动,而不是由属性驱动。 换句话说,您应该查看其他业务代码,而不是实体本身。如果你可以看到相对多的地方应该使用ItemPackage以相同的方式使用iheritence(但并非绝对必要)。如果单一原因是共享唯一标识符,则继承是不合理的。