c# - 如果存储库用于聚合根,那么其他实体的数据访问逻辑应该放在哪里?

标签 c# .net domain-driven-design

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

最佳答案

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

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

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

注意:也请参阅评论中的线程。尽管根实体可以(并且经常会)引用其他根实体,但不赞成允许任何根实体的存储库包含管理(创建、更新)的功能(这可能是一种过于温和的措辞) ,或删除)它引用的对象图中的任何根实体。任何此类引用的根实体都应该有自己的独立存储库,管理它们的功能(创建、更新和/或删除操作)应该在它们的存储库中,这样它就只在一个地方。

关于c# - 如果存储库用于聚合根,那么其他实体的数据访问逻辑应该放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5107062/

相关文章:

c# - 将参数传递给 CosmosDB 存储过程

c# - 为什么 C# 不推断我的泛型类型?

c# - 关于英语的问题 : Using plural in the first part of an identifier name

validation - CQRS DDD : How to validate products existence before adding them to order?

c# - 当他/她的帐户被锁定时向用户发送短信通知消息,我如何在 C# 中执行此操作

c# - 从互联网上的txt文件中获取文本

c# - 是否应该等待嵌套的可等待操作?

c# - 如何在 Windows Phone 中暂停秒表?

spring - 对 Spring-Data DDD 存储库模式感到困惑

c# - 访问 xslt 中的 C# 方法