存储库和服务之间的区别?


105

存储库和服务之间有什么区别?我似乎不明白。

我说的是通过数据访问层进行数据访问,通常是使用linq to sql。

我经常看到带有简单CRUD方法的存储库,以及带有更多特定于业务的方法的服务。

我们可以以这篇博客文章为例。如果您查看底部的接口(图像),那么他有两个存储库和两个服务。一个人怎么知道放在哪里?

就像我说过的,对于CRUD式的操作,存储库似乎更多,而服务的存储则更面向业务。

谢谢


你可以校准吗?在什么情况下?像大多数单词一样,这些单词所使用的上下文有助于定义含义。
David

2
注意:这里我不是在谈论Web服务或其他东西。我说的是通过数据层的数据访问。
alexn

Answers:


78

存储库本质上是持久性的立面,它使用集合样式语义(添加,更新,删除)来提供对数据/对象的访问。这是将存储数据/对象的方式与应用程序其余部分分离的一种方式。

服务提供操作您的应用程序所需的协调或其他“服务”。它们的不同之处在于,服务通常不知道如何从持久性访问数据,而存储库通常访问您可能拥有的任何服务的数据/对象。


19
我会说存储库是一种用于数据访问的服务。
伊恩·林罗斯(Ean Ringrose)2009年

5
从某种意义上说,这是一个很好的定义,因为我们编写的几乎所有内容在某种程度上都是“服务”,但是却失去了存储库应该是对象集合的基本意图。
jlembke

4
如果您使用单元测试,可能更清楚地将存储库视为最小化抽象,以最小化避免数据库所需的模拟。
Henry Heikkinen

repository= collection来自backbone.jsrepository= service来自angular
slideshowp2

159

存储库是数据存储的地方。服务是操纵数据的东西。

在实际情况比较中,如果您的钱存储在银行的金库中,则金库就是存储库。存款,取款等柜员是服务。


7
感谢您的回答!简单明了。
alexn

1
同意以上评论!也喜欢现实世界的解释!
克利

6
毫米 因此,如果银行决定摆脱金库,将钱放在matrass下,出纳员仍将像以前一样与您进行交互,而您无需了解存储库层中的更改。
丹尼斯

1
我怀疑客户会想知道该实现,@Dennis
Chucky

1
@丹尼斯是的。这实际上是使用存储库模式的主要优点之一。您应该能够更改存储库接口的实际实现,而无需更改服务上的任何内容。这对于单元测试和使您的代码松散耦合具有巨大的好处。
沃伦公园

12

我要说的是一般意义上的第一次尝试(直到有条件的情况下再给予更多说明):

  • 一个是你放置一些全局对象,供以后使用。
  • 一个服务是一个业务逻辑代码,由显式的(并且理想地从表示层,以及数据库层分离?)

3
然后可以执行以下操作:我的存储库具有我所有的复杂数据库调用,然后在我的服务中将存储库作为依赖项注入。现在,我已经可以轻松测试代码,并消除了我的疑虑,因为我的服务不知道数据库调用是如何完成的,而只是调用执行该操作的存储库的功能。因此,业务逻辑和数据访问是分开的。这是可行的方法吗?
darophi

如果所有逻辑都写在服务中,那么控制器将仅调用服务?
Islomkhodja Hamidullakhodjaev
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.