代码之家  ›  专栏  ›  技术社区  ›  Mayo

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

  •  1
  • Mayo  · 技术社区  · 14 年前

    我一直在和 S#arp Architecture

    有很多ASP.NETMVC示例显示控制器通过存储库接口在域模型上操作。事实上 S#arp Architecture tutorial 使StaffMembersController引用它调用FindAllMatching(在存储库中实现)的IStaffMemberRepository。StaffMember实体也位于域/核心层,看起来像一个具有属性的数据包,并且对属性的验证最少。

    "Designing Business Entities" 在微软的应用程序架构指南中,我相信这些关注点可以被称为“域服务”。

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

    3 回复  |  直到 14 年前
        1
  •  6
  •   Jon    14 年前

    你所说的域服务就是我所说的应用服务。对三种不同类型的服务(应用程序、域和基础设施)的这种混淆导致了“任务”一词在Who Can Help Me中的使用?(而不是应用程序服务)。

    广义地说,我将域服务视为域内不属于任何单个实体的操作/行为—这与Evans DDD书中描述的非常相似。应用程序服务更像是域上的编排层/门面,它允许应用程序与域进行交互,而不需要知道它如何工作的全部细节。

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

    关于他们应该住在哪里-我想说你应该在他们自己的项目中有他们。如果您对它是纯粹的,那么契约也应该存在于它们自己的程序集中,这意味着如果您愿意,您可以从您的控制器中删除域的所有知识。然而,WCHM方法将契约放在域项目中,并允许控制器了解实体。有些人对此表示不满,但这基本上只是一种妥协。

    乔恩

        2
  •  3
  •   Craig Stuntz    14 年前

    就我个人而言,我不喜欢S#arp架构(至少在他们的演示项目中)如何让控制器直接与存储库通信。我的$0.02是域服务应该是控制器和存储库之间的接口。存储库的存在严格是为了抽象出数据库(例如,这样您就可以在测试期间用LINQ to对象替换它)。域服务实现您的业务逻辑。您希望能够在不连接到数据库或不必模拟整个会话的情况下测试它们。

    我认为正确的一个例子是在马克·西曼的书中开发的MVC项目,

        3
  •  3
  •   HowardvanRooijen    14 年前

    我们构建了一个基于夏普架构的真实世界的生态游戏平台,并创建了一个演示项目来展示我们所构建的架构。这增加了ViewModels、Mappers和一个有助于分离关注点的任务层。这将形成夏普架构v2.0的核心架构

    http://whocanhelpme.codeplex.com/ 更多细节。