聚合根.兔子洞到底有多远

Mat*_*hew 9 c# domain-driven-design aggregate aggregateroot repository-pattern

我正在尝试将Repository模式用于我当前的项目,而我目前正在尝试对域进行建模并找到聚合根.

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

我将以警察事件为例: -

事件(聚合根) - 这可能包含调查人员,每个官员做的笔记.它还可能包含嫌疑人的受访日期列表.是否为此事件获得了闭路电视录像?每次看CCTV的日志和谁?是中央电视台为证据/法庭等制作的副本

似乎IncidentAggregate可能会变得庞大,因为它看起来一切都挂在那个事件上.

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

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

Kur*_*urt 10

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

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

但是,事件汇总将参考代表人员,嫌疑人和CCTV查看日志条目的汇总.


Roy*_*hay 9

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

如果你删除了一个事件,你还想删除调查人员吗?不 - 如果你这么做,你很快就会没有警察离开.调查人员不在事件汇总中.

在你列出的其他事情,嫌疑人,采访,闭路电视等等.答案是 - 这取决于.

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

如果唯一的工作是跟踪一系列事件并假设嫌疑人,采访和闭路电视只是因为一次事件而在系统中,那么是的,将它们全部集中在一起可能是合适的.如果事件被删除,嫌疑人,采访和央视都可以去.

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

进出聚合的内容取决于您的问题域.或者更确切地说,这取决于您对问题域解决方案进行建模的方式.

想想生命周期.