使用域驱动设计建模多对多关系

时间:2015-03-15 22:46:07

标签: java c# oop domain-driven-design

我试图使用域驱动设计来模拟多对多关系。

我的模型中的方案具有零个或多个父方案以及零或模式子方案。一对方案之间的关系描述如下:

ParentScheme,ChildScheme,RelationshipRule,RelationshipPriority

我正在考虑使用以下Scheme实体对其进行建模:

public class Scheme 
{
    public int Id {get; set;}
    public string SchemeName {get; set;}
    public IEnumerable<Scheme> Parents {get; set;}
    public IEnumerable<Scheme> Children {get; set;}
}

上述实体的问题在于它没有捕获RelationshipRule和RelationshipPriority值。所以我正在考虑创建一个名为SchemeRelationship

的独立实体
public class SchemeRelationship 
{
    public int Id {get; set;}
    public Scheme Scheme {get; set;}
    public Scheme ChildScheme {get; set;}
    public string RelationshipRule {get; set;}
    public int RelationshipPriority {get; set;}
}

还要更改我的Scheme实体以引用:

public class Scheme 
{
    public int Id {get; set;}
    public string SchemeName {get; set;}
    public IEnumerable<SchemeRelationship> Parents {get; set;}
    public IEnumerable<SchemeRelationship> Children {get; set;}
}

我对这种方法的问题是,在我的域中,方案关系并不是一个真正的实体。拥有一个id对它来说真的没有意义。也许将关系建模为价值对象会更有意义吗?我对使它成为一个值对象的唯一保留是值对象应该是不可变的,但在我们的域中,RelationshipPriority可能会改变一个关系。我是域名驱动设计的新手,所以对于如何最好地建模这一点的任何建议都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

如果父母和孩子的架构之间存在多对多关系,则以下设计可能对您的方法有用

class Schema
{
    public int Id { get; set; }
    public string SchemeName { get; set; }
    public string RelationshipRule { get; set; }
    public int RelationshipPriority { get; set; }
}

class ParentSchema : Schema
{
    public IEnumerable<ChildSchema> Children { get; set; }
}

class ChildSchema : Schema
{
    public IEnumerable<ParentSchema> Parents { get; set; }
}

- SJ