【发布时间】:2011-05-31 02:28:27
【问题描述】:
阅读this question 及其答案以及其他一些资源后,我认为我的应用程序有 3 个聚合根,因此应该有 3 个匹配的存储库,但我不确定在需要时应该如何使用这些存储库获取作为其他聚合根之一的数据。
我们来看一个例子。想象一个更简单的 Stack Overflow 版本,它包含用户、标签和问题的概念。在我看来,这些都是聚合根,因为我们需要列出和查询它们,因此每个都应该有自己的存储库。
鉴于您查看用户个人资料并且还希望显示用户发布的所有问题,您是否应该使用UsersRepository 中的QuestionsRepository 来填充user.Questions数组?
我相信这个问题更多的是关注点分离,但它解决了存储库应该如何交互的问题。在我看来,在存储库之间产生循环引用变得非常容易。
例如UsersRepository 从 QuestionsRepositiory 获取所有用户问题,对于每个问题,使用 UsersRepository 的实例获取用户数据等等。
现在让我们来看看相反的情况(我刚刚谈到了一点)。要列出所有问题,我们将使用QuestionsRepository 并调用GetAll() 方法(或类似方法)。在这个清单中,我们想要显示用户信息,所以我们需要从数据库中获取它。
理想情况下,在这种情况下,我们希望执行从 Questions 到 Users 的连接,而不是获取所有问题并遍历它们以每次都获取用户,从而给我们带来 N+1 的情况和大量不必要的访问数据库。
是否允许 QuestionsRespository 实例化 Users 以执行连接? 还是必须使用 UsersRepository,以防止单次访问数据库。
明显的后续行动是给您一个标签,并需要显示所有问题及其用户。 TagsRepository 是否应该使用QuestionsRespository 来获取所有问题,而tag LIKE 'tag-name' 又使用UsersRepository 来获取每个问题的用户信息? 或者TagsRepository 是否允许实例化Questions 和 Users 填充对象图?
【问题讨论】:
标签: design-patterns data-access-layer repository-pattern