如果存储库是针对聚合根的,那么其他实体的数据访问逻辑应该去哪里?

Gre*_*egB 11 .net c# domain-driven-design

我有一些代表Web应用程序的对象.目前,我有一个集群对象来表示应用程序的特定部署.在集群对象中,我有以下对象:服务器,客户,用户.如果不成为集群的一部分,这些对象都不能存在,因此我创建了一个ClusterRepository来从数据库中检索集群.现在,从集群中我需要获得一个Customers列表,可能是通过使用Cluster对象中的方法,如GetCustomers().现在,我最初的想法是将此操作的工作卸载到CustomerRepository,但由于存储库仅用于聚合根,因此数据访问逻辑应该在哪里?这属于服务类吗?

Cha*_*ana 5

实质上,聚合根是您可能需要作为对象图的根获取的任何对象.仅仅因为特定实体是聚合根并且具有存储库,并不意味着作为其属性之一的另一个实体也不能是聚合根 - 使用它自己的存储库.

一个很好的例子是客户计费系统.客户肯定是一个聚合根,并且将包含一组发票......但对于另一个应用程序函数,发票本身可能是一个聚合根,其对象图中包含组成LineItem对象.

因此,在您的示例中,如果您需要在某些情况下单独获取群集,则为客户创建另一个存储库没有任何问题.

注意:请参阅注释中的线程.虽然根实体可以(并且经常会)引用其他根实体,但是不赞成(并且这可能是一个过于温和的短语)允许任何根实体的存储库包含管理(创建,更新)的功能,或删除)其引用的对象图中的任何根实体.任何此类引用的根实体都应该有自己的各个存储库,管理它们的功能(创建,更新和/或删除操作)应该在它们的存储库中,以便它只在一个地方.

  • 您将引用与聚合"成员资格"混淆.研究汽车的例子.Car是一个聚合根,并且在其聚合中包含实体.引擎也是聚合根.Car拥有对Engine的引用,但Engine从未成为Car聚合的一部分.根据您的相同论点,如果根重叠,则一个根可以修改另一个根.如果mod是删除,则第二个根可以离开它负责孤立的实体.更糟糕的不一致.您将在Evans中找到没有示例,其中作为聚合根的对象也是另一个聚合的成员. (3认同)