我有一些代表Web应用程序的对象。目前,我有一个集群对象来表示应用程序的特定部署。在集群对象中,我有以下对象:服务器,客户,用户。如果不成为集群的一部分,这些对象都不能存在,因此我创建了一个ClusterRepository来从数据库中检索集群。现在,从集群中我需要获得一个Customers列表,可能是通过使用Cluster对象中的方法,如GetCustomers()。现在,我最初的想法是将此操作的工作卸载到CustomerRepository,但由于存储库仅用于聚合根,因此数据访问逻辑应该在哪里?这属于服务类吗?
答案 0 :(得分:5)
基本上,聚合根是您可能需要作为对象图的根获取的任何对象。仅仅因为特定实体是聚合根,并且具有存储库,并不意味着作为其中一个属性的另一个实体也不能是聚合根 - 使用它自己的存储库。
一个很好的例子是客户计费系统。客户肯定是一个聚合根,并且将包含一组发票......但对于另一个应用程序函数,发票本身可能是一个聚合根,其对象图中包含组成LineItem对象。
因此,在您的示例中,如果您需要在某些情况下独立地获取群集,那么为客户创建另一个存储库没有任何问题。
注意:请参阅评论中的主题。虽然根实体可以(并且经常会)引用其他根实体,但是不赞成(并且这可能是一个过于温和的短语)允许任何根实体的存储库包含管理(创建,更新)的功能,或删除)其引用的对象图中的任何根实体。任何此类引用的根实体都应该有自己的各个存储库,管理它们的功能(创建,更新和/或删除操作)应该在它们的存储库中,以便它只在一个地方。