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

ale*_*exn 82 design-patterns

存储库和服务之间有什么区别?我似乎没有抓住它.

我在谈论通过数据访问层进行数据访问,通常使用linq到sql.

我经常看到使用简单CRUD方法的存储库,以及具有更多业务特定方法的服务.

我们可以以此博客文章为例.如果你看一下底部的接口(图像),他有两个存储库和两个服务.怎么知道放在哪里?

正如我所说,对于类似CRUD的操作和服务更加面向业务,存储库似乎更多.

谢谢

Dav*_*vid 121

存储库是存储数据的位置.该服务是操纵数据的.

在实际情况比较中,如果您的钱存储在银行的保险库中,则保险库是存储库.存款,取款等的出纳员就是服务.

  • 我怀疑客户想了解该实施,@Dennis (5认同)
  • 谢谢你的回答!简洁明了. (4认同)
  • 毫米 因此,如果银行决定摆脱金库,将资金置于matrass下,出纳员仍将像以前一样与您进行交互,而您无需了解存储库层中的更改。 (2认同)

jle*_*bke 71

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

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

  • 我会说Repository是一种用于数据访问的服务. (13认同)
  • 这是一个很好的定义,因为我们编写的几乎所有内容都是某种程度上的"服务",但它失去了存储库应该是对象*集合的基本意图. (3认同)
  • 如果您进行单元测试,可能会更清楚地将存储库视为最小化抽象来最小化避免数据库所需的模拟. (3认同)

Sly*_*tor 15

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

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

存储库使用原始 SQL 查询或通过 ORM(例如 Eloquent、Sequelize、Gorm、Hibernate 等)与数据库进行通信

服务调用存储库中的一个或多个方法来获取特定结果。(在服务中,您可以调用存储库中名为 findOne() 的示例方法,然后根据结果调用 updateOne())


KLE*_*KLE 12

我会说,作为第一次尝试,在一般意义上(直到你给出更多的背景,如果你有一个):

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

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

小智 11

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

@David 的回答肯定对我有帮助,但我想稍微歪曲他的方法。

银行比喻:银行将你的钱存放在金库中,金库是一个数据库。柜员可以从金库存取款,柜员就是保管库。顾客就是要求柜员存款或取款的人,顾客就是服务人员。

你甚至可以更进一步说你的雇主(写你支票的人)是控制者:D

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

因此,通过这种方式思考,您可以看到存储库只关心执行数据库操作或事务,许多服务/客户可以访问同一个存储库/柜员。