Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DDD中的服务和存储库(C#)_C#_Design Patterns_Repository Pattern - Fatal编程技术网

DDD中的服务和存储库(C#)

DDD中的服务和存储库(C#),c#,design-patterns,repository-pattern,C#,Design Patterns,Repository Pattern,在DDD中,服务和存储库如何相互关联?我的意思是,在过去的两天里,我一直在阅读DDD,无论我走到哪里,总有一个服务层,总有一个存储库层。这些是如何区别或互补的 据我所知,存储库不是负责委托应用程序和数据之间交互的层吗 那么,如果服务层必须实现存储库才能与数据交互,那么它需要什么呢?即使存储库可能已经实现了这样做所需的方法 我希望能在这个问题上有所启发 另外,我不知道这是否有帮助,但我正在使用一个ASP.NETMVC2应用程序,我正在尝试在其中实现存储库模式。我刚刚完成依赖注入模式的实现(这是有史

在DDD中,
服务
存储库
如何相互关联?我的意思是,在过去的两天里,我一直在阅读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