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

Posted

技术标签:

【中文标题】存储库和服务之间的区别?【英文标题】:Difference between repository and service? 【发布时间】:2010-11-29 05:34:57 【问题描述】:

存储库和服务之间有什么区别?好像没看懂。

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

我经常看到具有简单 CRUD 方法的存储库和具有更多业务特定方法的服务。

我们可以以this 博文为例。如果您查看底部的接口(图像),他有两个存储库和两个服务。怎么知道该放什么?

正如我所说,存储库似乎更适合类似 CRUD 的操作和更面向业务的服务。

谢谢

【问题讨论】:

你能校准吗?在什么情况下?与大多数单词一样,这些单词的使用上下文有助于定义含义。 注意:我不是在谈论网络服务或其他东西。我说的是通过数据层访问数据。 ***.com/questions/22963352/… 【参考方案1】:

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

在实际情况比较中,如果您的钱存放在银行的保险库中,那么保险库就是存储库。存款、取款等的柜员就是服务。

【讨论】:

感谢您的回答!简洁明了。 同意以上评论!也喜欢现实世界的解释! 毫米。因此,如果银行决定摆脱金库,将钱放在 matrasses 下,出纳员仍会像以前一样与您互动,而您不必知道存储库层的变化。 我怀疑客户会想知道那个实现,@Dennis @Dennis 是的。这实际上是使用存储库模式的主要优点之一。您应该能够更改存储库接口的实际实现,而无需更改服务上的任何内容。这对于单元测试和使您的代码松散耦合具有巨大的好处。【参考方案2】:

Repository 本质上是 persistence 的一个外观,它使用集合样式语义(添加、更新、删除)来提供对数据/对象的访问。这是一种将您存储数据/对象的方式与应用程序的其余部分解耦的方式。

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

【讨论】:

我会说存储库是一种用于数据访问的服务。 这是一个很好的定义,因为我们编写的几乎所有东西在某种程度上都是“服务”,但它失去了存储库应该是集合的基本意图> 对象。 如果您了解单元测试,可能更清楚地将存储库视为最小抽象,以尽量减少避免数据库所需的模拟。 repository = collection from backbone.js or repository = service from angular?【参考方案3】:

我会说作为一般意义上的第一次尝试(直到你提供更多上下文,如果你有的话):

存储库是放置一些全局对象的地方,供以后使用。 服务是明确的业务逻辑代码(最好与表示层和数据库层分开?)

【讨论】:

那么是否可以执行以下操作:我的存储库具有所有复杂的数据库调用,然后在我的服务中我将存储库作为依赖项注入。现在我有了易于测试的代码并分离了我的关注点,因为我的服务不知道数据库调用是如何完成的,而只是调用存储库的函数。因此业务逻辑和数据访问是分开的。这是一种可行的方法吗? 如果所有的逻辑都写在services里,那么controller只会调用service?【参考方案4】:

以 MVC 应用程序为例。控制器向服务发出指令,服务与存储库对话以对数据库中的数据进行一些 CRUD。

这是使用DI完成的(依赖注入:这就像一个孩子告诉父亲给他钱但不关心钱是如何得到的,所以得到钱的方法是从孩子的知识中抽象出来的)

Repository 在厨房准备菜肴

服务调用一个或多个厨师(存储库中的方法)以获得特定的定制餐

【讨论】:

【参考方案5】:

在执行任何所需的业务逻辑后,存储库会处理数据访问和服务调用。

@David 的回答肯定对我有帮助,但我想稍微改变一下他的方法。

银行隐喻:银行将您的钱存放在保险库中,保险库是一个数据库。柜员可以从金库中存取款,柜员就是仓库。客户是要求柜员存取款的人,客户就是服务。

您甚至可以进一步说您的雇主(为您开支票的人)是控制人:D

控制器将您的支票交给您 -> 您在将支票交给出纳员之前验证以确保一切正确 -> 出纳员存款。

所以这样想你可以看到存储库只关心做数据库操作或事务,许多服务/客户可以去同一个存储库/柜员。

【讨论】:

以上是关于存储库和服务之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

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

WCF 服务库和 WCF 服务应用程序之间的区别

WCF服务库和WCF服务应用程序之间的区别[重复]

库和 API 之间还有区别吗?

托管库和非托管库之间有啥区别?

存储库和用例有啥区别?