Gar*_*eth 11 nhibernate domain-driven-design
因此,在一个典型的模型中,您的父母可以拥有许多孩子,而孩子只能拥有一个父母,那么如何管理孩子的添加.我一直在使用这种方法;
public class Parent
{
public Parent()
{
Children = new List<Child>();
}
public IList<Child> Children
{
get;
private set;
}
}
public class Child
{
public Parent Parent
{
get;
set;
}
}
var child = new Child();
var parent = new Parent();
parent.Children.Add(child);
child.Parent = parent;
Run Code Online (Sandbox Code Playgroud)
问题是,无论我想添加一个新的孩子,我都必须记住添加对孩子和父母的引用,这有点痛苦.我可以将AddChild方法添加到父类,并使其负责添加子项 - 现在的问题是有两种方法可以通过Children属性和方法添加子项.这是一个更好的解决方案吗?
public class Parent
{
public Parent()
{
children = new List<Child>();
}
private IList<Child> children
{
get;
private set;
}
public IEnumerable<Child> Children
{
get
{
return children;
}
}
public void AddChild(Child child)
{
children.Add(child);
child.Parent = this;
}
}
Run Code Online (Sandbox Code Playgroud)
对此有最佳实践的指导,你做什么?
Ste*_*ger 10
这根本不是NHibernate的问题.
您应该实现AddChild方法.这些类负责它们的一致性,因此它们不应该暴露任何不可用的东西.例如,应隐藏(可变)子列表.公开IEnumerable是个好主意.
你的第二个代码是一个很好的起点.您可能需要更多方法,如RemoveChild或CoundChildren.
我是这样做的:
public class Parent
{
private ISet<Child> _children = new HashedSet<Child>();
public ReadOnlyCollection<Child> Children
{
get{ return new List(_children).AsReadOnly(); }
}
public void AddChild( Child c )
{
if( c != null && !_children.Contains (d) )
{
c.Parent = this;
_children.Add (c);
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,事实上,这也是Stefan所说的.我只是公开了Children列表的只读副本,这样您就可以轻松地遍历父项的子项,并获得父项的子项数.必须使用AddChild和RemoveChild成员方法完成向父项添加和删除子项.
我这样做,只是我不使用私有列表的属性
private IList<Child> _children
public IEnumerable<Child> Children
{
get
{
return children;
}
}
Run Code Online (Sandbox Code Playgroud)