我正在学习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层中。
但是,在基础架构层内部,我们有存储库实现,用于访问数据库。那么,在这种情况下,存储库是数据库服务?基础结构服务和存储库之间有什么区别?
提前致谢!
答案 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发送电子邮件,或代码为您提取数据库访问权限(因此,您可以在存储库中使用的某些类,但它不是你的存储库。)
因此,不要将您的存储库放入“基础架构”,因为它们不属于那里。 对我来说,可以在基础设施中找到的类是可以在不同的其他项目中使用的类,看看我的意思?与您的域模型或应用程序不紧密相关的类属于基础结构。存储库实现与特定应用程序紧密耦合。 :)