DDD基础设施服务

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编程.

祝好运!


Ty.*_*Ty. 7

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

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


Roy*_*ver 6

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

可能的装配或包装结构:

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对象.

  • DDD的要点不是拥有某种项目结构,而是要在您的实体上拥有行为.当你说"制作你的ORM对象的副本"时,听起来你正在使用贫血领域,这根本不是真正的DDD.行为(域状态突变)应该在域对象内部,而不是在服务中. (2认同)