DDD中Services
和Repositories
如何相互关联?我的意思是,在过去的两天里,我一直在阅读DDD以及我去过的任何地方,总是有一个Service
图层,并且总是有一个Repository
图层。这些如何区分或互相恭维?
据我所读,不是Repository
层负责委托应用程序和数据之间的交互吗?
那么,如果Service
层必须实现Repository
与数据交互,即使Repository
可能已经实现了所需的方法,也需要Repository
层。 ?
我很欣赏这个主题的一些启示。
P.S。不知道这是否会有所帮助,但我正在使用ASP.NET MVC 2应用程序,我正在尝试实现Repository模式。我刚刚完成了依赖注入模式(有史以来第一次)......
更新
好的,有这么多答案,我想我明白了它的不同之处。所以,审查(纠正我,如果我错了):
IEmployeeRepository
图层仅与数据库或ORM中的单个对象进行交互,Employee
- > Service
。
Repositories
图层在从AEmployee
返回的对象中封装了更复杂的功能,无论是一个还是多个。
那么,我有一个子问题。创建要发送到我的视图的抽象对象被认为是不好的做法吗?例如A
abstract
I
,因为我interface
表示Employee
},其中包含来自X
和X
的属性还是Service
?
实际上,还有一个问题。如果某个应用程序可以认为{{1}}层被“调整”,那么它是否需要通过接口实现?
答案 0 :(得分:24)
服务将使用存储库检索实体,然后调用其上的方法(实体)来执行命令/任务。
答案 1 :(得分:18)
是的,存储库可以处理数据(即SQL,Web服务等),但这只是 作业。 CRUD操作,仅此而已。没有基于存储过程的业务逻辑的地方。
服务(或业务逻辑层)提供功能。 如何填写业务请求(即计算薪水),你必须做什么。
哦,这是一本非常好的DDD书: http://www.infoq.com/minibooks/domain-driven-design-quickly
答案 2 :(得分:10)
作为具体示例,购物车应用程序可能具有以下服务:
ShoppingCartService - 管理包含添加/删除/更新支持等的商品。
OrderService - 购买购物车,将其转换为订单并处理付款流程等。
这些服务中的每一个都需要为CRUD操作谈论“数据源”。这就是Repository模式派上用场的地方,因为它抽象了数据的加载和保存,数据来源是数据库,Web服务甚至是内存缓存。
当您想要创建应用程序的快速原型而无需处理数据库设置,架构,存储过程,权限等时,您可以在几分钟内创建缓存或伪存储库。
对于上面的示例,您的原型可能会从以下开始:
一旦您的原型准备好演变到下一个级别,您就可以针对真实数据库实现这些:
答案 3 :(得分:5)
从我记忆中来看,存储库是数据之前的最后一个类。服务类可以对从存储库中检索的数据执行操作。存储库实际上只是为了将数据提供给其他人来完成工作。服务层可以提供所有数据必须通过的业务逻辑等内容。它还可以提供应用程序逻辑和数据层之间的转换。但同样,这正是我能记住的。
答案 4 :(得分:4)
没有定义服务或存储库的黄金标准。在我的应用程序中,存储库(如您所说)是数据库的接口。服务具有对存储库的完全访问权限 - 但该服务向其使用者公开了一部分功能。
将存储库视为更低级别。存储库必须公开许多访问底层数据库的方法。服务可能将对存储库的调用与仅在代码级别(即不在数据库中)有意义的其他代码组合,例如访问应用程序中的其他状态,或者无法轻松应用于其中的验证/业务逻辑数据库。