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

Gup*_*R4c 21 c# design-patterns repository-pattern

如何ServicesRepositories在DDD的相互关系?我的意思是,在过去的两天里,我一直在阅读DDD,无论我走到哪里,总会有Service一层,而且总有Repository一层.这些如何区分或互相恭维?

从我所读到的,不是Repository负责委托应用程序和数据之间的交互的层?

那么,Service如果层必须实现Repository与数据交互,那么对层的需求是什么,即使Repository可能已经实现了所需的方法?

我很欣赏这个主题的一些启示.

PS不知道这是否有用,但我正在使用ASP.NET MVC 2应用程序,我正在尝试实现Repository模式.我刚刚完成了依赖注入模式的实现(有史以来第一次)......

UPDATE

好的,有这么多答案,我想我明白了它的不同之处.所以,审查(纠正我,如果我错了):

  • Repository层只与单个对象从数据库或ORM的相互作用,IEmployeeRepository- > Employee.

  • Service层封装上从返回的对象更复杂的功能Repositories,无论是一个或多个.

那么,我有一个子问题.创建要发送到我的视图的抽象对象被认为是不好的做法吗?例如一个AEmployee(A对于abstract因为对我来说I意味着interface),其含有从性能EmployeeXX

实际上,还有一个问题.如果一个Service层可以被认为是"调整"的应用程序,它是否需要通过接口实现?

que*_*rin 25

服务将使用存储库检索实体,然后在其上调用方法(实体)以执行命令/任务.


boj*_*boj 18

确实,存储库使用数据(即SQL,Web服务等),但这是唯一的工作.CRUD操作,仅此而已.基于存储过程的业务逻辑没有地方.

服务(或业务逻辑层)提供功能.如何以fullfill业务请求(即计算工资),什么你必须做的.

哦,这是一本非常好的DDD书:http: //www.infoq.com/minibooks/domain-driven-design-quickly

  • 为什么存储过程中没有业务逻辑?我认为这是一个不必要的约束.一些业务逻辑在数据库中更自然地实现.有一些很好的理由不使用存储过程来处理复杂的逻辑 - 但是大多数原因都源于团队中没有太多的SQL技能.业务逻辑应存在于域服务中 - 但存储库是域服务的一部分. (2认同)

Tod*_*ith 10

作为具体示例,购物车应用程序可能具有以下服务:

ShoppingCartService - 管理一系列带有添加/删除/更新支持等的项目.

OrderService - 购物车,将其转换为订单并处理付款流程等.

这些服务中的每一个都需要为CRUD操作谈论"数据源".这就是Repository模式派上用场的地方,因为它抽象了数据的加载和保存,数据来源是数据库,Web服务甚至是内存缓存.

当您想要创建应用程序的快速原型而无需处理数据库设置,架构,存储过程,权限等时,您可以在几分钟内创建缓存或虚拟存储库.

对于上面的示例,您的原型可能会从以下开始:

  • FakeCustomerRepository
  • FakeAddressRepository
  • FakeCartRepository
  • FakeCartLineItemRepository
  • FakeOrderRepository
  • FakeOrderLineItemRepository

一旦您的原型准备好进入下一个级别,您就可以针对真实数据库实现这些:

  • SQLCustomerRepository
  • SQLAddressRepository
  • SQLCartRepository
  • SQLCartLineItemRepository
  • SQLOrderRepository
  • SQLOrderLineItemRepository


Jos*_*osh 6

根据我的记忆,存储库是数据之前的最终类.服务类可以对从存储库检索的数据执行操作.存储库实际上只是为了将数据提供给其他人来完成工作.服务层可以提供所有数据必须通过的业务逻辑等内容.它还可以提供应用程序逻辑和数据层之间的转换.但同样,这正是我记得的.