为高度相关的实体寻找关于存储库模式的基本指针

Posted

技术标签:

【中文标题】为高度相关的实体寻找关于存储库模式的基本指针【英文标题】:Looking for basic pointers on Repository Pattern for highly related entities 【发布时间】:2012-07-18 23:31:33 【问题描述】:

我正在使用 SQL Server CR E 3.5 用 C# 编写一个数据库应用程序,并希望实现一个存储库模式。我在 Google 和 SO 上都进行了几次搜索;但是,我找不到符合我需求的实现,所以我会直接询问 SO 社区。​​p>

我的应用程序中的关键业务对象是:视频、演员、标签类别和标签。基本业务规则如下:

    每个标签都属于一个标签类别。 一个视频可能有也可能没有多个与之关联的演员和标签。 演员和标签可能有也可能没有与之关联的多个视频。

这对我来说是模糊的:

    我应该实现一个包含演员、标签类别和标签的视频存储库,还是应该每个业务对象都有自己的存储库?鉴于这些对象可以独立存在,我倾向于为每个对象创建一个存储库。

    如果每个对象都应该有自己的存储库,我该如何关联它们?例如,视频存储库是否应该包含查询标签存储库以查找匹配项的属性?

我正在寻找一些设置指南或最佳做法。我了解存储库模式的基础知识,但我需要一些关于如何将它们连接在一起的建议。

【问题讨论】:

【参考方案1】:

您应该只有一个用于您的aggregate roots 的存储库。

我不建议使用存储库来封装所有您的查询。存储库不是查询的大垃圾场——它们是在 DDD 最适用的场景中使用的特定工具。有关更多信息,请参阅本文:http://ayende.com/blog/3955/repository-is-the-new-singleton

应该不需要“连接”或“关联”存储库。

如果您想编写诸如“加载此用户借用的视频的所有标签”之类的查询,最好不要将其放入存储库中。此查询很可能特定于特定情况,例如UI,应该写在需要查询的类内部或附近。查询的输出可能会映射到专为 UI 要求创建的只读数据传输对象,而不是您的实体。

【讨论】:

感谢您的建议。我将使用更少的存储库。

以上是关于为高度相关的实体寻找关于存储库模式的基本指针的主要内容,如果未能解决你的问题,请参考以下文章

C# + Nhibernate Eager Loading Join 不相关的存储库?

存储库模式 - 如何理解它以及它如何与“复杂”实体一起使用?

具有存储库模式的实体框架,将数据插入到具有多对多关系的表中

用于团队的 VSCode 私有扩展存储库

DAL 中的实体框架存储库模式,如何实现更新功能?

检测高度相关的属性