c# - 何时将某些实体分离到不同的存储库中?

标签 c# .net design-patterns domain-driven-design repository-design

我通常会尝试将所有相关实体保存在同一个存储库中。以下是两者有关系的实体(用缩进标示):

  • 用户
    • 用户偏好

因此进入用户存储库是有意义的。然而,用户通常链接到许多不同的实体,在下面的示例中您会怎么做?

  • 用户

    • 用户偏好
    • 订单
  • 顺序

    • 产品

订单与产品和用户都有关系,但您不会将所有 4 个实体的功能放在同一个存储库中。当您与用户实体打交道并收集订单信息时,您会做什么?您可能需要有关产品的额外信息,并且 ORM 通常会提供延迟加载的能力。但是,如果您的产品实体位于用户实体的单独存储库中,那么这肯定会导致存储库之间发生冲突吗?

最佳答案

在 Eric Evan 的领域驱动设计 (http://domaindrivendesign.org/index.htm) 中,您应该首先考虑您的聚合。然后围绕这些构建存储库。

有许多技术可以处理相互关联的聚合。我最常使用的一种是只允许聚合通过只读接口(interface)相互关联。聚合背后的一个关键思想是,如果不通过根,就无法更改底层对象的状态。因此,如果产品和用户是您模型中的根聚合,那么如果我通过用户->订单->产品到达它,我将无法更新产品。我必须从产品存储库中获取产品才能对其进行编辑。 (从 UI 的角度来看,你可以让它看起来像你去用户 -> 订单 -> 产品,但是当你点击产品编辑屏幕时,你从产品存储库中获取实体)。

当您通过 User->Order->Product 查看 Product(在代码中)时,您应该查看 Product 接口(interface),该接口(interface)没有任何方法可以更改 Product 的基础状态(仅获取 no套等)

根据您的使用方式组织您的聚合和存储库。我可以看到 User 和 Prodcut 是他们自己的聚合并拥有自己的存储库。根据您的描述,我不确定 Order 应该属于 User 还是独立存在。

当聚合关联时,两种方式都使用只读接口(interface)。当您必须从一个聚合交叉到另一个聚合时,请从它自己的存储库中获取它。

如果您的存储库正在缓存,那么当您(通过用户)加载订单时,仅从数据库加载产品 ID。然后使用产品 ID 从产品存储库加载详细信息。您可以通过在加载订单时加载产品上的任何其他不变量来进行一些优化。

关于c# - 何时将某些实体分离到不同的存储库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/368940/

相关文章:

java - 防止 Java 中运行时异常退出循环

c# - 在代码优先迁移中向具有现有行的表添加唯一索引时处理重复项

c# - 使用 ExcelDataReader 从特定单元格开始读取 Excel 数据

c# - 获取 double[,] 矩形数组的 double[] 行数组

.net - 在 win32 API 和 .NET 框架之间进行选择

c# - 是否有一种设计模式可以避免这种重复或反射(reflection)?

java - 确保对象始终是列表的成员?

c# - 大于 0 且小于 11 的整数的正则表达式

c# - 如何将dataGridView的前3列readOnly设置为true

c# - 如何在运行时仅在类上添加属性?