我想知道在處理父子關係時,以下哪一項被認爲是最佳實踐?域驅動設計 - 父子關係模式 - 規範模式
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