我有两个域对象,Parent
和Child
。 Parent
可以有零个或多个孩子,Child
可以属于零个或多个父母(如果父母离婚)。
因此,在域驱动设计的上下文中考虑这一点我会说Parent
和Child
都是AggregateRoot
。因为这是一种多对多的关系。
现在我想知道我应该如何在代码中对此进行建模。我需要能够访问Child
班级的家长,以及Parent
班级的所有孩子。
所以我想这样做:
public class Parent : AggregateRoot
{
public string FamilyName {get;set;}
public IList<Guid> ChildrenIds {get;set;}
}
public class Child : AggregateRoot
{
public string Name {get;set;}
public IList<Guid> ParentIds {get;set;}
}
让这两个课程通过他们的id
相互引用是否可以?
或者是否有更好的方法对此进行建模?
父母及其子女可以在我们的申请中注册。然后,我们的系统会记录该孩子经历的事件。游泳,去博物馆等。
例如;
我需要能够使用以下用例:
答案 0 :(得分:0)
当我有两个相互引用的模型时,我强迫自己寻找一个缺失的部分。
听起来您的企业并不关心谁是孩子的父母,它关心的是谁在某个特定时间点对孩子负责。所以它可能看起来像你缺少第三个域模型:Guardian
(我确定它们是一个更好的名称),这消除了父和子实体明确引用彼此的需要。
class Guardian {
GuardianId Id {get;private set;}
ParentId ParentId {get;private set;}
ChildId ChildId {get;private set;}
List<DateRule> WhenResponsible {get;private set;}
bool IsResponsibleForChildAt(date day) {
return WhenResponisble.Any(dr=>dr.AppliesToDate(day));
}
}
现在,根据您的业务,Guardian
模型可能更自然地适合Child或Parent模型,您的域专家应该能够在这里提供帮助。