何时将某些实体分成不同的存储库?

时间:2008-12-15 16:35:27

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

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

  • 用户
    • UserPreference

所以进入用户存储库是有意义的。但是,用户通常会链接到许多不同的实体,您将在以下示例中执行哪些操作?

  • 用户

    • UserPrefence
    • 顺序
  • 顺序

    • 产品

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

4 个答案:

答案 0 :(得分:5)

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

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

当您从User-> Order-> Product查看产品(代码中)时,您应该查看无法更改产品基础状态的Product接口(仅限得到没有等等。)

根据您使用它们的方式组织您的聚合及其存储库。我可以看到User和Prodcut是他们自己的Aggregates并拥有自己的Repositories。我不能从您的描述中确定订单是属于用户还是独立。

当聚合关联时,无论哪种方式都使用只读接口。当你必须从一个Aggregate交叉到另一个Aggregate时,从它自己的Repository中获取它。

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

答案 1 :(得分:1)

通过存储库你的意思是类?

根据对象(存储库)的使用,您可以创建一个视图,该视图将数据库中的数据组合在一起,并使用ORM创建一个类(存储库)来表示该视图。当您想要显示重量较轻的对象时,此设计可以使用,每个表只有几列。

答案 2 :(得分:0)

如果SQL Server是您的数据库,并且存储库是指数据库,那么我只是将信息粘贴在任何有意义的数据库中,并在依赖数据库中拥有一个视图,该视图通过三点表示法从另一个数据库中选择。

答案 3 :(得分:0)

我仍然对“存储库”的含义感到困惑。我会讨论你所谈论的所有关于不同类的事情(因此是单独的文件),并且它们都存在于同一个项目中。