我一直在使用S#arp Architecture,但这可能适用于任何DDD架构(域/核心,应用服务,基础架构和演示文稿)。
有许多ASP.NET MVC示例显示控制器通过存储库接口在域模型上运行。实际上,S#arp Architecture tutorial具有引用IStaffMemberRepository的StaffMembersController,它调用FindAllMatching(在存储库中实现)。 StaffMember实体(也在域/核心层)看起来像一个数据包,其属性和对属性的最小验证。
假设您的控制器变得臃肿,看起来像商业问题。在阅读微软应用程序架构指南中的Microsoft "Designing Business Entities"章节后,我相信这些问题可以称为“域服务”。
我想将这些域服务放在域/核心层中,但我不确定它们应该去哪里。我应该在域/核心项目中创建一个服务文件夹,该文件夹承载带有其下面的实现文件夹的接口吗?这似乎是一个很好的方法,但我想看看其他人如何处理这个问题。
谢谢!
答案 0 :(得分:6)
您在问题中称之为域名服务的是我称之为“应用程序服务”的内容。对三种不同类型的服务(应用程序,域和基础架构)的这种混淆是什么导致谁可以帮助我使用术语“任务”? (而不是应用程序服务)。
从广义上讲,我将域服务视为域内不属于任何单个实体的操作/行为 - 这与Evans DDD一书中描述的非常相似。应用程序服务更多地是域上的业务流程层/外观,允许应用程序与域交互,而无需了解有关其工作方式的完整详细信息。
所以我相信您需要一个应用程序服务层来从控制器中删除膨胀。这是WCHM中显示的方法,它是我现在在我的应用程序中遵循的方法。
就他们应该居住的地方而言 - 我会说你应该把他们放在他们自己的项目中。如果你是纯粹的,合同也应该存在于他们自己的程序集中,这意味着如果你愿意,你可以从你的控制器中删除所有域知识。但是,WCHM方法将合同放在Domain项目中,并允许控制器了解实体。有些人抱怨这个,但基本上只是妥协。
希望这会有所帮助 乔恩
答案 1 :(得分:3)
就个人而言,我不喜欢S#arp架构(至少在他们的演示项目中)让控制器直接与存储库对话。我的0.02美元是域服务应该是控制器和存储库之间的接口。存储库严格存在以抽象出数据库(例如,因此您可以在测试期间将其替换为LINQ to Objects)。域服务实现您的业务逻辑。您希望能够在不连接数据库的情况下测试它们,或者必须模拟整个会话。
我认为这样做的一个例子是Mark Seeman的书中开发的MVC项目, .NET中的依赖注入。
答案 2 :(得分:3)
我们构建了一个基于Sharp Architecture的真实世界ecommorce平台,并创建了一个演示项目,展示了我们实施的架构。这增加了ViewModels,Mappers&一个帮助区分问题的任务层。这将构成Sharp Architecture v2.0的核心架构
有关详细信息,请参阅http://whocanhelpme.codeplex.com/。