我们使用存储库模式正确吗?


14

我们正在使用一堆带有后缀的独立类,-repository以从数据库中检索数据。每个表都有自己的存储库。

例如,我们有一个customerrepository具有各种方法来检索客户的类,并且具有一个vacancyrepository具有各种方法来检索空缺的类。

关于这种做事方式,我有两个问题:

  1. 如何获取跨越多个表的数据?例如,我有一个屏幕,显示所有尚未创建空缺的客户。可以customerrepository从中使用方法vacancyrespository,还是两个存储库都返回结果,并且层次结构中是否有更高的类(我们将其命名为a dataservice)从两个存储库中获取结果并将它们合并为1个结果?

  2. 这样的存储库可以处理多少逻辑?
    我认为可以在存储库中实现“ where active == true”以仅检索活动记录,还是应该由层次结构中较高的类来处理简单的逻辑(将其命名为a dataservice)?

我现在遇到的示例是以下示例:

我们有一个问题列表,其中包含一个或多个问题。
问题可以有一个结果,该结果保存在单独的表中。
因此,当您要检索问题列表的总结果时,必须合并questionlist表,问题表和questionstatus表中的数据。

现在,我们为这些表提供3个不同的存储库。

如果我要问questionlistrepository清单12的总结果是什么,那将不得不从另外两个存储库中获取数据,因此其中有些逻辑,这是允许的吗?

还是有questionlistdataservice哪个知道要使用哪个存储库?

还有一件事:我们的存储库可以生成一个结果,IQueryable以便调用服务可以轻松地合并结果,但是如果不是这种情况,我认为从列表中检索所有三个表的所有内容不是一个好主意。数据库。


1
通常,在多个表访问中,优势表由记录的表确定,该记录必须在查询获取之前存在。在LEFT OUTER JOIN中,这是提到的第一个表,在RIGHT OUTER JOIN中,它是第二个表。
尼尔

Answers:


15

存储库返回域对象,并建立在映射层之上。对于一个非常简单的域,域对象和数据库表可以非常相同。

如果您的存储库总是返回数据结构的精确表示,那么它实际上可能是表数据网关,也就是数据访问对象(DAO)。

示例:您的数据库具有用于人员和地址的表。在您的应用程序域中,地址不是它自己的实体,它只是Person的属性。在这种情况下,您将没有PersonRepository和AddressRepository。您只有PersonRepository。域不应该关心域数据如何持久化。这些职责位于存储库后面的一层中。

从您的示例中,您似乎实际上已经拥有DAO,并且刚刚将它们命名为Repositories。


因此,在创建存储库时,我还可以将Table数据网关更深一层,而我们的存储库实际上是TDG的。
2013年

1
您可以,但是要权衡成本和收益。不要因为代码“分层”的原则而欺负DAO和存储库。在这种情况下,请执行最易读的内容。如果您的存储库倾向于对DAO中的数据进行大量重组,则分离以及由此产生的抽象层可能会很有用。
Mihai Danila
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.