域驱动设计 - 父子关系模式 - 规范模式

Chr*_*ris 6 .net c# java domain-driven-design

我想知道在处理父母子女关系时,以下哪项被认为是最佳做法.

1)以下示例似乎是一种常见做法,但在创建子实例时,只要未添加到父级,它就处于无效状态.这不会导致验证等问题.

public class Parent
{
    private ICollection<Child> children;

    public ReadOnlyCollection Children { get; }

    public void AddChild(Child child)
    {
        child.Parent = this;
        children.Add(child);
    }
}


public class Child
{
    internal Parent Parent
    {
        get;
        set;
    }

    public Child()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

2)下一个样本将注意孩子必须始终与其父母相关.

public class Parent
{
    private ICollection<Child> children;

    public ReadOnlyCollection Children { get; }

    public Child CreateChild()
    {
        var child = new Child();
        child.Parent = this;
        children.Add(child);
        return child;
    }
}


public class Child
{
    internal Parent Parent
    {
        get;
        set;
    }

    internal Child()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

3)在最后一个例子中,孩子负责与父母本身的关系.

public class Parent
{
    private ICollection<Child> children;

    public ReadOnlyCollection Children { get; }

    public void AddChild(Child child)
    {
        child.Parent = this;
        children.Add(child);
    }
}


public class Child
{
    public Parent Parent
    {
        get;
        set;
    }

    public Child(Parent parent)
    {
        this.Parent = parent;
    }
}
Run Code Online (Sandbox Code Playgroud)

哪种模式被认为是最好的?我相信模式2可能是最好的,因为如果没有与父母的关系,孩子就永远不会存在.这将使得例如在实现可能执行以下操作的规范模式时更容易:

public class ChildSpecification
{
    bool IsSatisfiedBy(Child child)
    {
        return child.Parent.Children.Where(someCondition).Count > 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

上述规范只有在孩子有父母的情况下才有效.

你怎么看?你知道更好的方法吗?提前致谢

Kla*_*sen 6

我绝对喜欢建议2号,但我认为它忽略了在3发现,即如果一些重要的东西Child没有一个可以不存在的物体Parent,应该采取Parent在其构造的对象.此外,课堂Parent上的财产Child应该是只读的.所以你最终会得到类似的东西:

public class Parent 
{ 
    private ICollection<Child> children; 

    public ReadOnlyCollection Children { get; } 

    public Child CreateChild() 
    { 
        var child = new Child(this); 
        children.Add(child); 
        return child; 
    } 
} 


public class Child 
{ 
    internal Parent Parent 
    { 
       get; 
       private set; 
    } 

    internal Child(Parent parent) 
    { 
       this.Parent = parent;
    } 
} 
Run Code Online (Sandbox Code Playgroud)


ala*_*irg 0

我倾向于使用选项(1) - 对我来说一直很有效。重要的是不要将子集合本身暴露给外界 - 父级应该能够调解所有访问。但我非常高兴在其他地方创建一个子级 - 我只关心它被添加到父级时,此时可以检查它的有效性等。

我不明白你的规范示例:如果父母的任何一个孩子的 someCondition 为 true ,你的 ChildSpecification 似乎会返回 true 。当然,IsSatisfiedBy(Child child)仅当作为参数传递的特定子级满足条件时才应返回 true。