Zyg*_*tas 17 c# asp.net-mvc domain-driven-design
我正在学习DDD,我在Infrastructure层有点丢失:
据我所知,"所有优秀的DDD应用程序"应该有4层:演示文稿,应用程序,域和基础架构.应使用存储库访问数据库.存储库接口应该位于域层和存储库实现中 - 在基础结构中(参考DDD:在哪里保留域接口,基础结构?).
应用程序,域和基础架构层应该/可能有服务(参考www.lostechies.com/blogs/jimmy_bogard/archive/2008/08/21/services-in-domain-driven-design.aspx),例如基础架构层中的EmailService它发送电子邮件.
但是,在基础架构层内部,我们有存储库实现,用于访问数据库.那么,在这种情况下,存储库是数据库服务?基础结构服务和存储库之间有什么区别?
提前致谢!
Kev*_*ber 17
坚持使用DDD定义,存储库与服务不同.存储库直接与实体相关联,通常是聚合根.服务定义的行为并非真正属于您域中的单个实体.您可以在每个层中找到服务,尽管它们所解决的问题类型因层而异,可能与DDD的概念服务不同.
在概念级别工作时,DDD存储库与DDD服务的不同之处在于它与实体持久性特别相关.服务可以解决您可能遇到的任何域,应用程序或基础架构问题.
你在整个地方遇到与DDD的术语冲突.例如,DDD Repository与Martin Fowler的PoEAA书中的Repository模式不同,尽管它可能采用这种模式.这通常是许多人混淆的根源.
如果您始终将域模型保持在您所做的每件事的中心,它将有助于DDD.在分层DDD应用程序时,我经常选择Jeffrey Palermo的洋葱架构.看看这个.下载CodeCampServer,一个使用此架构的示例应用程序.我认为它非常适合DDD编程.
祝好运!
关于DDD的一个不幸的事是"服务"这个词.它应该是"域名服务".将域视为实体和值对象,而服务是处理操作,操作和活动的一种方式.
至于存储库,它们只是一个外观,应该像您的域的集合.如果您正在使用ORM或编写自己的ORM,那么这就是您的所有域对象应该经历的,以便直接实现持久性而不是那些服务.
也许它有助于看到潜在的项目结构.
可能的装配或包装结构:
Project.Domain 
Project.Infrastructure.Data 
Project.Infrastructure.Components 
Project.Infrastructure.Services
可能的命名空间或文件夹结
Project.Domain 
-n- Modules 
---- n- Account 
------- 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- Mail 
-n- Cryptography 
-n- UI
Project.Infrastructure.Services(Special Operations)
-f- DoingSomethingService1.xx 
-f- DoingSomethingService2.xx 
-f- DoingSomethingService3.xx
域实体和值类型不使用域服务.应用层使用域的服务.Domain Repository对象使用Infrastructure.Data对象返回Domain对象.