我有几个代表网络应用程序的对象。目前我有一个集群对象来表示应用程序的特定部署。在集群对象中,我有以下对象:服务器、客户、用户。这些对象都不能不属于集群而存在,因此我创建了一个 ClusterRepository 来从数据库中检索集群。现在,我需要从集群中获取客户列表,大概是通过使用集群对象中的方法,如 GetCustomers()。现在,我最初的想法是将此操作的工作卸载到 CustomerRepository,但由于存储库仅用于聚合根,数据访问逻辑应该放在哪里?这属于服务类别吗?
最佳答案
从本质上讲,聚合根是您可能需要作为对象图的根获取的任何对象。仅仅因为特定实体是聚合根并具有存储库,并不意味着作为其属性之一的另一个实体不能也是聚合根 - 具有自己的存储库。
一个很好的例子是客户计费系统。 Customer 肯定会是一个聚合根,并且会包含发票的集合......但是对于另一个应用程序功能,发票本身可能是一个聚合根,其对象图中包含 LineItem 对象。
因此,在您的示例中,如果您需要在某些情况下独立于集群获取客户,则为客户创建另一个存储库没有任何问题。
注意:也请参阅评论中的线程。尽管根实体可以(并且经常会)引用其他根实体,但不赞成允许任何根实体的存储库包含管理(创建、更新)的功能(这可能是一种过于温和的措辞) ,或删除)它引用的对象图中的任何根实体。任何此类引用的根实体都应该有自己的独立存储库,管理它们的功能(创建、更新和/或删除操作)应该在它们的存储库中,这样它就只在一个地方。
关于c# - 如果存储库用于聚合根,那么其他实体的数据访问逻辑应该放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5107062/