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

时间:2010-11-11 22:17:47

标签: c# design-patterns repository-pattern

DDD中ServicesRepositories如何相互关联?我的意思是,在过去的两天里,我一直在阅读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},其中包含来自XX的属性还是Service

实际上,还有一个问题。如果某个应用程序可以认为{{1}}层被“调整”,那么它是否需要通过接口实现?

5 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:18)

是的,存储库可以处理数据(即SQL,Web服务等),但这只是 作业。 CRUD操作,仅此而已。没有基于存储过程的业务逻辑的地方。

服务(或业务逻辑层)提供功能。 如何填写业务请求(即计算薪水),你必须做什么

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

答案 2 :(得分:10)

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

ShoppingCartService - 管理包含添加/删除/更新支持等的商品。

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

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

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

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

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

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

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

答案 3 :(得分:5)

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

答案 4 :(得分:4)

没有定义服务或存储库的黄金标准。在我的应用程序中,存储库(如您所说)是数据库的接口。服务具有对存储库的完全访问权限 - 但该服务向其使用者公开了一部分功能。

将存储库视为更低级别。存储库必须公开许多访问底层数据库的方法。服务可能将对存储库的调用与仅在代码级别(即不在数据库中)有意义的其他代码组合,例如访问应用程序中的其他状态,或者无法轻松应用于其中的验证/业务逻辑数据库。