我想知道在处理父子关系时,以下哪一项被认为是最佳实践?域驱动设计 - 父子关系模式 - 规范模式
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()
{
}
}
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()
{
}
}
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;
}
}
哪种模式被认为是最好的?我相信模式2可能是最好的,因为如果没有与父母的关系,孩子永远不会存在。这会使得它更容易,例如实施可能会做这样的事情的规范模式时:
public class ChildSpecification
{
bool IsSatisfiedBy(Child child)
{
return child.Parent.Children.Where(someCondition).Count > 0;
}
}
如果一个孩子有一个父以上规格才能发挥作用。
您认为如何?你知道更好的方法吗?在此先感谢
规范模式是关于我目前在我的一个项目中遇到的特殊情况。一个孩子有一个有效日期范围,它不应该与子集合中任何其他孩子的任何其他有效日期范围相交。你会认为这是父母的规范吗? – Chris 2010-01-28 16:25:09
我可能会在Parent的addChild()方法中实现这个作为警戒条件。家长然后不允许添加例如抛出异常。在这种情况下,我可能不会使用规范。 – alasdairg 2010-01-28 17:07:02
但我需要在UI上检查。所以当抛出异常时,我不得不接受这一点。这也不是很优雅。而afaik关于规范的好处是我可以在很多不同的场景中使用它,例如1.)在我的域oe中2.)在客户端应用程序中预先验证业务逻辑。或者我错了? – Chris 2010-01-28 17:20:10