在域模型项目中放置"域服务"的位置

May*_*ayo 1 architecture asp.net-mvc domain-driven-design repository s#arp-architecture

我一直在使用S#arp架构,但这可能适用于任何DDD架构(域/核心,应用服务,基础架构和演示).

有许多ASP.NET MVC示例显示控制器通过存储库接口在域模型上运行.事实上,S#arp架构教程的StaffMembersController引用了IStaffMemberRepository,它调用了FindAllMatching(在存储库中实现).StaffMember实体(也在域/核心层)看起来像一个数据包,其属性和属性的最小验证.

假设您的控制器变得臃肿,看起来像商业问题.在阅读Microsoft的"应用程序架构指南"中的Microsoft "设计业务实体"一章后,我认为这些问题可称为"域服务".

我想将这些域服务放在域/核心层,但我不确定它们应该去哪里.我应该在域/核心项目中创建一个服务文件夹,该文件夹承载带有其下面的实现文件夹的接口吗?这似乎是一个很好的方法,但我想看看别人如何处理这个问题.

谢谢!

Jon*_*Jon 6

您在问题中称为域服务的是我称之为"应用程序服务"的内容.对三种不同类型的服务(应用程序,域和基础架构)的这种混淆是什么导致谁可以帮助我使用术语"任务"?(而不是应用程序服务).

从广义上讲,我将域服务视为域内不属于任何单个实体的操作/行为 - 这与Evans DDD一书中描述的非常相似.应用程序服务更多地是域上的编排层/外观,允许应用程序与域交互,而无需了解有关其工作方式的完整详细信息.

因此,我认为您需要一个应用程序服务层来从控制器中删除膨胀.这是WCHM中显示的方法,它是我现在在我的应用程序中遵循的方法.

就他们应该居住的地方而言 - 我会说你应该把他们放在他们自己的项目中.如果你是纯粹的,合同也应该存在于他们自己的程序集中,这意味着如果你愿意,你可以从你的控制器中删除所有域知识.但是,WCHM方法将合同放在Domain项目中,并允许控制器了解实体.有些人抱怨这个,但这基本上只是妥协.

希望这有助于Jon