存储库和服务之间的区别是什么? 我似乎不太明白。
我讨论的是通过数据访问层进行数据访问,通常使用 linq 到 sql。
我经常看到具有简单 CRUD 方法的存储库,以及具有更多业务特定方法的服务。
我们可以以 这个博客文章为例。如果您查看底部的接口(图像) ,他有两个存储库和两个服务。一个人怎么知道把什么放在哪里?
如前所述,存储库似乎更适合于类 CRUD 操作,而服务更面向业务。
我会说,作为第一次尝试,在一般意义上(直到你给出更多的背景,如果你有一个) :
Repository 本质上是 坚持不懈的 facade,它使用 Collection 样式语义(Add、 Update、 Remove)来提供对数据/对象的访问。这是一种将数据/对象与应用程序其余部分存储方式解耦的方法。
服务提供操作应用程序所需的协调或其他“服务”。它们非常不同,因为服务通常不知道如何从持久性访问数据,而存储库通常是 只有访问您可能拥有的任何服务的数据/对象。
存储库是存储数据的地方,而服务是操作数据的。
在现实情况下的比较中,如果您的钱存放在银行的金库中,金库就是存储库。存款、取款等的出纳员是服务人员。
以 MVC 应用程序为例。Controller 向 Service 发出指令,服务与 Repository 进行对话,对数据库中的数据执行一些 CRUD 操作。
这是通过 DI 完成的(依赖注入: 这就像一个孩子告诉父亲给他钱,但是不关心钱是如何得到的,所以得到钱的方法是从孩子的知识中抽象出来的)
存储库可以使用原始 SQL 查询或通过 ORM 与数据库通信(例如雄辩、 Sequelize、 Gorm、 Hibernate e.t.c)
服务调用存储库中的一个或多个方法以获得特定的结果。(在服务中,您可以调用存储库中名为 findOne ()的示例方法,然后根据结果调用 updateOne ())
存储库处理数据访问,服务在执行任何所需的业务逻辑之后调用数据访问。
@ 大卫的回答肯定对我有所帮助,但我想稍微歪曲一下他的方法。
银行比喻: 银行把你的钱存在金库里,金库就是一个数据库。出纳员可以从保险库中存款或取款,出纳员就是保险库。客户是要求出纳员存取款的人,客户就是服务。
你甚至可以更进一步,说你的雇主(不管是谁给你开支票)是控制者:
控制器将检查-> 验证以确保所有内容都正确,然后再交给出纳员-> 出纳员存款。
因此,从这个角度来看,您可以看到存储库只关心执行数据库操作或事务,许多服务/客户可以使用同一个存储库/出纳员。