比较存储库与提供者与服务[关闭]

Posted

技术标签:

【中文标题】比较存储库与提供者与服务[关闭]【英文标题】:compare repository vs provider vs service [closed] 【发布时间】:2012-05-26 17:48:56 【问题描述】:

我需要实现从某个远程数据源检索数据的逻辑。现在我需要决定——我需要哪个概念:Provider、Repository 或 Service。

其实我不是很明白这两者之间的巨大区别。是的,我知道存储库是更具体的数据,不应该包含任何业务逻辑。另一方面,提供者除了管理数据外,还可能包含一些业务规则。 Service 除了管理数据外,还可以包含一些业务逻辑。那么Service和Provider有什么区别呢。

从另一个角度来看,我认为使用服务是更好的方法来表明它是远程访问的抽象。

结论:所有这些方法看起来都是合理的,我完全对此感到困惑。如果有人能帮助我,将不胜感激。

【问题讨论】:

***.com/questions/623090/… forums.asp.net/t/… 【参考方案1】:

存储库和服务不是相互排斥的。事实上,它们经常一起使用。

服务层位于您的领域对象之上,并为业务操作提供粗粒度接口。它通常描述您的应用程序的用例。服务层使用存储库来获取您的域对象,并在可能的情况下将进一步的执行委托给它们。

存储库就像一个持久域对象的集合。它提供了使用某些标准查找正确对象的方法。它还提供了保存这些对象的方法。

存储库在野外的实现差异很大。存储库可以提供类似的方法

List<Person> findPersonByName(String name)

或更通用的标准对象方法

List<Person> find(Criteria criteria)

补充阅读:service layer、repository

我不熟悉提供者模式。

【讨论】:

【参考方案2】:

所有这些方法看起来都很合理,我完全混淆了 它。

难怪你会感到困惑,因为现在人们似乎为了任何事情都求助于服务和提供者,而这恰恰相反;)

Repository 模式的定义更精确:它是一组相同类型的对象,您可以从中查询、添加或删除,对调用者显示为内存中的集合,但实际上映射到后面的持久存储场景。

如何找到一个真正描述您的对象所做的名称而不是使用淡化的、破烂的概念包?我完全支持所有开发人员都可以立即识别的模式和共享习语,但是当它们不再意味着任何精确时,我看不到单词的使用......

【讨论】:

【参考方案3】:

简单来说,您的服务 Service S 使用 Repository R 进行数据库 CRUD 或搜索操作。 假设你有不同的服务 S1、S2、S3,每一个都有相同的合约(接口)但不同的实现,你需要一个提供者来选择在什么上下文中使用哪一个。 您可以使用依赖注入覆盖提供者模式,这样您的代码耦合度就会降低,并且不负责实例化服务,您的客户端将使用 DI 容器实例化正确的服务

【讨论】:

【参考方案4】:

Repository封装了特定的数据逻辑来获取数据,例如ICustomerRepository可以有SqlCustomerRepository、mysqlCustomerRepository的实现。但是,DataProvider 抽象了数据逻辑并使用配置的方式来解析数据。数据可以来自数据库、平面文件或 NoSql 数据库。此外,与注入服务的存储库实现不同,DataProvider 的配置可以在上下文中更改。另一方面,正如 Nefron 解释的那样,Service 在实体中定义的业务逻辑上运行。

【讨论】:

像“EmailSender”类的一般“外部”操作怎么样?它的后缀是什么?一方面它不是存储库而不是 DataProvider,另一方面它不是内部应用程序依赖项,因此根据您的回答,我们不能将其称为服务。

以上是关于比较存储库与提供者与服务[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Azure Blob 存储与文件服务 [关闭]

集合库与方便使用集合

部署YUM源仓库与NFS共享存储服务

JavaNIO

当这些存储在外部身份提供者服务中时与用户的关系

php 版本号 整数化 mysql存储入库 比较大小版本处理类,提供版本与数字互相转换