DDD中的服务和存储库(C#)
在DDD中,DDD中的服务和存储库(C#),c#,design-patterns,repository-pattern,C#,Design Patterns,Repository Pattern,在DDD中,服务和存储库如何相互关联?我的意思是,在过去的两天里,我一直在阅读DDD,无论我走到哪里,总有一个服务层,总有一个存储库层。这些是如何区别或互补的 据我所知,存储库不是负责委托应用程序和数据之间交互的层吗 那么,如果服务层必须实现存储库才能与数据交互,那么它需要什么呢?即使存储库可能已经实现了这样做所需的方法 我希望能在这个问题上有所启发 另外,我不知道这是否有帮助,但我正在使用一个ASP.NETMVC2应用程序,我正在尝试在其中实现存储库模式。我刚刚完成依赖注入模式的实现(这是有史
服务
和存储库
如何相互关联?我的意思是,在过去的两天里,我一直在阅读DDD,无论我走到哪里,总有一个服务
层,总有一个存储库
层。这些是如何区别或互补的
据我所知,存储库
不是负责委托应用程序和数据之间交互的层吗
那么,如果服务层必须实现存储库
才能与数据交互,那么它需要什么呢?即使存储库
可能已经实现了这样做所需的方法
我希望能在这个问题上有所启发
另外,我不知道这是否有帮助,但我正在使用一个ASP.NETMVC2应用程序,我正在尝试在其中实现存储库模式。我刚刚完成依赖注入模式的实现(这是有史以来第一次)
更新
好吧,有这么多答案,我想我明白区别是什么了。因此,回顾一下(如果我错了,请纠正我):
存储库
层仅与数据库或ORM中的单个对象交互,IEEmployeeRepository
->员工
服务
层封装了从存储库
返回的对象(一个或多个)上更复杂的功能
那么,我有一个子问题。创建要发送到我的视图的抽象对象是否被认为是不好的做法?例如AEmployee
(A
表示摘要
,因为对我来说I
意味着接口
),它包含员工
和X
或X
的属性
实际上,还有一个子问题。如果一个服务
层可以被认为是为一个应用程序“调优”的,那么它是否需要通过一个接口来实现?据我所知,存储库是数据之前的最后一个类。服务类可以对从存储库检索到的数据进行操作。存储库实际上只是为了将数据提供给其他人来完成工作。服务层可以提供所有数据都必须通过的业务逻辑等内容。它还可以提供应用程序逻辑和数据层之间的转换。不过,这也是我所记得的。没错,存储库可以处理数据(如SQL、Webservice等),但这是唯一的工作。积垢操作,仅此而已。基于存储过程的业务逻辑没有位置
服务(或业务逻辑层)提供了功能。如何填写业务申请(即计算工资),你必须做什么
哦,这是一本非常好的DDD书:
没有定义服务或存储库的黄金标准。在我的应用程序中,存储库(如您所说)是数据库的接口。服务具有对存储库的完全访问权限,但该服务向其使用者公开了一部分功能
将存储库视为较低级别。存储库必须公开许多访问底层数据库的方法。服务可能会将对存储库的调用与仅在代码级别(即不在数据库中)才有意义的其他代码结合起来,例如对应用程序中其他状态的访问,或无法轻松应用于数据库的验证/业务逻辑。该服务将使用存储库检索实体,然后对其调用方法(实体)来执行命令/任务。作为一个具体示例,购物车应用程序可能具有以下服务:
ShoppingCartService-使用添加/删除/更新支持等管理商品购物车
OrderService-使用购物车,将其转换为订单,并处理付款流程等
这些服务中的每一项都需要为CRUD操作提供一个“数据源”。这就是存储库模式的用武之地,因为它将数据加载到数据源或从数据源(无论是数据库、web服务,甚至是内存缓存)中保存数据抽象出来
当您希望创建应用程序的快速原型而不必处理数据库设置、架构、存储过程、权限等时,您可以在几分钟内创建缓存或假存储库
对于上面的示例,您的原型可能从以下内容开始:
- 伪造客户地址
- 伪造地址存储库
- 假货仓库
- FakeCartLineItemRepository
- 伪造订单存储库
- FakeOrderLineItemRepository
一旦您的原型准备好发展到下一个级别,您就可以针对实际数据库实现这些功能:
- SQLCustomerRepository
- SQLAddressRepository
- SQLCartRepository
- SQLCartLineItemRepository
- SQLOrderRepository
- SQLOrderLineItemRepository
我相信服务可以聚合多个存储库。存储库和服务的常见/流行用法(在许多示例和教程中都有这种用法)之间存在很大差异以及域驱动设计是如何定义这些的。我相信理解这些区别是很重要的。@Sergey是对的-每个聚合根应该有一个存储库,但服务可以(并且将会)有一个存储库通过工作单元模式,可以跨多个存储库工作。顺便问一下,像这样的问题可以问多少次?关于堆栈溢出,有很多问题。对于你来说,除了你不能调用存储的进程之外,你完全可以。为什么不可以?如果你可以从视图返回数据,为什么不从存储的pro返回数据cedure?这假设没有存储过程?如果有存储过程,调用代码在哪里?如果不在存储库中,我不同意存储库模式p