DDD基础设施服务

时间:2009-09-05 18:42:40

标签: c# asp.net-mvc domain-driven-design

我正在学习DDD,我在基础设施层中有点迷失:

据我所知,“所有优秀的DDD应用程序”应该有4层:演示文稿,应用程序,域和基础架构。应使用存储库访问数据库。存储库接口应该位于域层和存储库实现中 - 在基础结构中(参考DDD: Where to keep domain Interfaces, the Infrastructure?)。

应用程序,域和基础架构层应该/可能有服务(参考www.lostechies.com/blogs/jimmy_bogard/archive/2008/08/21/services-in-domain-driven-design.aspx),例如EmailService在发送电子邮件的Infrastructure层中。

但是,在基础架构层内部,我们有存储库实现,用于访问数据库。那么,在这种情况下,存储库是数据库服务?基础结构服务和存储库之间有什么区别?

提前致谢!

4 个答案:

答案 0 :(得分:15)

坚持使用DDD定义,存储库与服务不同。存储库直接与实体相关联,通常是聚合根。服务定义的行为并非真正属于您域中的单个实体。您可以在每个层中找到服务,尽管它们所解决的问题类型因层而异,可能与DDD的概念服务不同。

在概念级别工作时,DDD存储库与DDD服务的不同之处在于它与实体持久性特别相关。服务可以解决您可能遇到的任何域,应用程序或基础架构问题。

你到处都遇到与DDD的术语冲突。例如,DDD Repository与Martin Fowler的PoEAA书中的Repository pattern不同,尽管它可能采用这种模式。这通常是许多人混淆的原因。

如果您始终将域模型保持在您所做的一切的中心,那么它有助于DDD。在分层DDD应用程序时,我经常选择Jeffrey Palermo's Onion Architecture。看看这个。下载CodeCampServer,一个使用此架构的示例应用。我认为它非常适合DDD编程。

祝你好运!

答案 1 :(得分:7)

关于DDD的一个不幸的事是“服务”这个词。它应该是“域名服务”。将域视为实体和值对象,而服务是处理操作,操作和活动的一种方式。

至于存储库,它们只是一个外观,应该像您的域的集合一样。如果您正在使用ORM或编写自己的ORM,那么这就是您的所有域对象应该经历的,以便直接实现持久性而不是直接实现这些服务。

答案 2 :(得分:6)

也许有助于看到潜在的项目结构。

可能的装配或包装结构:

Project.Domain
Project.Infrastructure.Data
Project.Infrastructure.Components
Project.Infrastructure.Services

可能的命名空间或文件夹结构:

Project.Domain
-n-模块
---- n-帐户
------- f- Account.xx
------- f- AccountRepository.xx
------- f- Contact.xx
---- n-营销
------- f- RegionRepository.xx
-n-共享
-n-服务

Project.Infrastructure.Data(OR-Mappers)
-n-表
-n-意见
-n-程序
-n-功能

Project.Infrastructure.Components(Generic)
-n-邮件
-n-密码学 -n-用户界面

Project.Infrastructure.Services(Special Operations)
-f- DoingSomethingService1.xx
-f- DoingSomethingService2.xx
-f- DoingSomethingService3.xx

域实体和值类型不使用域服务。应用层使用域的服务。 Domain Repository对象使用Infrastructure.Data对象返回Domain对象。

答案 3 :(得分:-4)

为什么要将存储库实现放入基础架构?他们与所有imho都没有“基础设施”。

根据Evan's Blue Book,存储库是域模型的一部分。因此,我将存储库接口放在域模型中。有时也会实施存储库。

基础设施应包含“基础设施”代码,该代码可以是一种服务,使您可以轻松地通过smtp发送电子邮件,或代码为您提取数据库访问权限(因此,您可以在存储库中使用的某些类,但它不是你的存储库。)

因此,不要将您的存储库放入“基础架构”,因为它们不属于那里。 对我来说,可以在基础设施中找到的类是可以在不同的其他项目中使用的类,看看我的意思?与您的域模型或应用程序不紧密相关的类属于基础结构。存储库实现与特定应用程序紧密耦合。 :)