9

我正在尝试为我当前的项目使用存储库模式,并且我目前正在尝试对域进行建模并找到聚合根。

我读过“级联删除”规则,该规则指出,如果在删除根目录时删除成员没有意义,那么它不应该是根目录的一部分。

我将以警察事件为例:-

事件(总根)- 这可能包含调查人员、每个人员所做的记录。它还可能包含带有接受采访日期列表的嫌疑人。是否获得了事件的闭路电视录像?每次观看 CCTV 的日志以及由谁观看?是否复制了中央电视台的证据/法庭等

看起来 IncidentAggregate 可能会变得巨大,因为似乎一切都取决于该事件。

我的问题是双重的,聚合根应该管理多少,根中的根是一个好主意吗?

这可能不是一个特别好的例子,因为你可能永远不会删除像警察事件这样的东西,但我希望它更好地描述了我的问题。

4

3 回答 3

10

聚合通常包含对其他聚合根的引用。删除包含聚合时应删除这些引用,但它们指向的聚合将保留。

用你的比喻。我们假设的报告只是一个事件聚合的一部分,并且会与聚合一起被删除。没有其他聚合将直接访问这些报告。

但是,事件汇总将引用代表官员、嫌疑人和 CCTV 观看日志条目的汇总。

于 2010-01-22T15:09:21.760 回答
9

聚合是一组具有相同生命周期的对象。

如果您删除了一个事件,您是否还想删除调查人员?不——如果你这样做了,你很快就会没有警察了。调查人员不在事件汇总中。

在你列出的其他事情中,嫌疑人、采访、闭路电视等。答案是——视情况而定。

这取决于您的问题域。你的系统在做什么?它的范围是什么?它解决了什么问题?

如果唯一的工作是跟踪一系列事件,并假设嫌疑人、采访和闭路电视仅作为单一事件的结果出现在系统中,那么是的,将它们全部放在一个集合中可能是合适的。如果事件被删除嫌疑人,采访和CCTV可以去。

例如,如果您还跟踪从市中心摄像机网络收集的闭路电视录像档案。也许您试图监控它们的有效性和可靠性。如果是这样,您需要以不同的方式处理闭路电视录像。它将处于具有自己生命周期的不同聚合中。如果您删除事件,您仍希望保留闭路电视录像以用于其他事件和性能指标。

聚合中的内容和内容取决于您的问题域。或者更准确地说,它取决于您为问题域解决方案建模的方式。

思考生命周期。

于 2010-01-25T21:51:33.650 回答
1

“根中之根是个好主意吗?”

在我看来,简短的回答是否定的。正如 Kurt 所说,您应该保留对其他聚合的引用。为了清楚起见,通过引用我的意思是识别对象。所以也许你的事件聚合会有一个属性,比如

public IEnumerable<Guid> InvestigatingOfficerIds 
{ 
    get { return _investigatingOfficerIds.AsReadOnly(); }
}

或者

public IEnumerable<OfficerReference> InvestigatingOfficerIds 
{ 
    get { return _investigatingOfficerIds.AsReadOnly(); }
}

其中 OfficeReference 是一个代表军官身份价值的类(引擎盖下可能是一个 Guid)。

如果您的域逻辑需要使用事件和调查人员执行操作,您可以将此逻辑抽象为域服务,并使用 IOfficerRepository 使用事件聚合上提供的 ID 获取人员聚合。

于 2011-02-08T17:07:39.530 回答