【问题标题】:How may repositories should I have and how should they interact if at all?我应该拥有多少存储库以及它们应该如何交互?
【发布时间】:2011-05-31 02:28:27
【问题描述】:

阅读this question 及其答案以及其他一些资源后,我认为我的应用程序有 3 个聚合根,因此应该有 3 个匹配的存储库,但我不确定在需要时应该如何使用这些存储库获取作为其他聚合根之一的数据。

我们来看一个例子。想象一个更简单的 Stack Overflow 版本,它包含用户、标签和问题的概念。在我看来,这些都是聚合根,因为我们需要列出和查询它们,因此每个都应该有自己的存储库。

鉴于您查看用户个人资料并且还希望显示用户发布的所有问题,您是否应该使用UsersRepository 中的QuestionsRepository 来填充user.Questions数组?

我相信这个问题更多的是关注点分离,但它解决了存储库应该如何交互的问题。在我看来,在存储库之间产生循环引用变得非常容易。

例如UsersRepositoryQuestionsRepositiory 获取所有用户问题,对于每个问题,使用 UsersRepository 的实例获取用户数据等等。

现在让我们来看看相反的情况(我刚刚谈到了一点)。要列出所有问题,我们将使用QuestionsRepository 并调用GetAll() 方法(或类似方法)。在这个清单中,我们想要显示用户信息,所以我们需要从数据库中获取它。

理想情况下,在这种情况下,我们希望执行从 Questions 到 Users 的连接,而不是获取所有问题并遍历它们以每次都获取用户,从而给我们带来 N+1 的情况和大量不必要的访问数据库。

是否允许 QuestionsRespository 实例化 Users 以执行连接? 还是必须使用 UsersRepository,以防止单次访问数据库。

明显的后续行动是给您一个标签,并需要显示所有问题及其用户。 TagsRepository 是否应该使用QuestionsRespository 来获取所有问题,而tag LIKE 'tag-name' 又使用UsersRepository 来获取每个问题的用户信息? 或者TagsRepository 是否允许实例化QuestionsUsers 填充对象图?

【问题讨论】:

    标签: design-patterns data-access-layer repository-pattern


    【解决方案1】:

    尝试考虑仅将存储库用于更改数据(命令)并为只读查询操作提供单独的服务/“读取存储库” - 并绕过通常的存储库,直接进入数据库,使用读取数据针对特定情况优化的 sql 查询。当您需要可以使用存储库轻松获得的信息(即显示有关一个用户的详细信息)时,我仍然会使用通常的存储库,但对于更复杂的场景使用只读服务(即显示一些汇总来自的数据的屏幕更多聚合根以相当复杂的方式)。但是请确保始终使用存储库来更改数据。

    您可以更进一步,研究一种称为 CQRS - 命令查询责任分离 (www.cqrsinfo.com) 的模式,它基本上是关于将更改应用程序状态的应用程序部分与读取/查询的应用程序部分完全分开应用程序状态),尽管需要一些时间来掌握它。 (请注意,CQRS 与 CQS 不同)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 2011-07-17
      • 1970-01-01
      • 2018-02-19
      • 2016-01-01
      • 2011-02-11
      • 2013-02-04
      相关资源
      最近更新 更多