如果您需要在页面上生成只读数据列表,并且该数据自然会来自多个(可能是 5 个或更多)不同的存储库,您会怎么做?
我们正在使用 DDD,并且一直在强制通过存储库访问我们的数据库,但是出现了一个似乎不适合 DDD 的场景,我们正在尝试确定要使用的最佳模式。
例如,假设您有一个基于社区的网站,其中包含视频、论坛、博客等。您有一个包含评论列表的论坛页面。这很粗糙,但我希望它是有道理的。
<table>
<tr><td>User Name (with possible link)</td><td>User's community score.</td><td>User Avatar</td><td>User's E-mail</td><td>User's blog</td><td>User's videos</td></tr>
</table>
<table>
<tr><td>This is a comment.</td></tr>
</table>
所以每条评论都包含几个不同的部分:用户名、社区分数、头像、电子邮件、用户的博客和用户的视频页面。传统上,这些信息都来自不同的存储库。
问题在于效率。存储库可以最大化,但只能围绕为其创建的聚合。当您需要访问位于多个存储库中的数据时,使用存储库的读取访问效率会降低。
我的解决方案是使用相关信息创建一个 UserInformation DTO,并在 UserForumsRepository 中放置一个带有签名的方法
ILIst<UserInformation> GetUserForumsUserInformationByForumPostID(int forumPostID).
我的一位同事建议以这种方式使用 DTO 会破坏我们一直在使用的设计模式,并建议更好的方法是获取论坛评论 id 列表,然后将这些 id 传递到各个存储库以返回结果。
我自己的观点是,存储库的主要目的是封装对 CRUD 的 CUD 部分很重要的业务逻辑,但只读列表应该以最有意义的方式生成。如果合适的话,我认为从存储库中完全删除只读列表方法甚至是有意义的(例如,在跨多个不同类型页面使用的公共小部件中)。
你如何处理这种情况?