Architecture 域服务与应用程序服务

Architecture 域服务与应用程序服务,architecture,Architecture,域服务和应用程序服务之间的主要区别是什么?(我正在使用NHibernate) 哪一层更适合业务逻辑?什么是最佳实践 -S#体系结构使用应用程序服务作为“协调层”,但不必解释为什么它不是域服务,而应该是业务逻辑。您的里程可能非常长,但我将尝试根据我使用它们的方式来定义。不管您的持久性层是什么,我都会将它们定义为实际使用: 域服务—用于加强域的完整性并促进插入、创建、删除和检索域数据的服务。此外,域服务可以将域对象的更高级别组合编排到viewmodels中。通常,这些是存储库顶部的外观,用于隐藏一

域服务和应用程序服务之间的主要区别是什么?(我正在使用NHibernate)

哪一层更适合业务逻辑?什么是最佳实践


-S#体系结构使用应用程序服务作为“协调层”,但不必解释为什么它不是域服务,而应该是业务逻辑。

您的里程可能非常长,但我将尝试根据我使用它们的方式来定义。不管您的持久性层是什么,我都会将它们定义为实际使用:

  • 域服务—用于加强域的完整性并促进插入、创建、删除和检索域数据的服务。此外,域服务可以将域对象的更高级别组合编排到viewmodels中。通常,这些是存储库顶部的外观,用于隐藏一些低级实现,并提供更符合UL(普适语言)的接口,以帮助管理期望

  • 应用程序服务-特定于域模型实现或不依赖于域模型的服务。一个典型的例子是根据域中的状态更改或操作发送和发送电子邮件。这通常是应用程序本身的一个需求,并且可能不是由域模型指定的。这可以由应用程序服务在调用域服务后按程序执行,也可以作为从域服务引发的事件执行

正如我所说,这可能不符合每个人的定义,但这有助于我确保正确的关注点进入正确的位置

至于把业务逻辑放在哪里更好,我实际上认为这很棘手。这种方法有多种类型的业务逻辑。如果存在无法在域中定义的特定于应用程序的逻辑需求,我会将其放在应用程序服务层中。直接影响域的东西,不管应用程序是什么,我都会放在域服务层

问题是真正需要时间来确定什么是真正的“领域关注点”。例如,除非知道用户的电子邮件地址,否则用户可能无法向任意应用程序发布评论。你可以说这属于任何一层。关键是要做到一致。

  • 域服务是域内由多个需要重用的类组成的服务

  • 应用程序服务是一些util类,在这些类中可以完成压缩或sms消息传递等技术工作


请将逻辑放入域对象而不是服务中。在复杂域中更好地重用。

我认为@Karsten在评论中引用的帖子比@joseph.ferris在这里发布的最上等答案更可信

域服务用于“域中非实体或价值对象自然责任的重要过程或转换”(Eric Evans域驱动设计)

应用程序服务只是应用程序(或其他外部消费者)的一种门面或API,它们通常对应于应用程序的一个用例,是接口客户端层所需的一组应用程序操作。它们不包含业务逻辑,也不包含任何领域专家有一天可能会来要求更改的内容。它们可能包含事务管理(工作单元)、应用程序验证(验证从数据库检索到的对象的状态/保存到数据库的输入)、安全验证和横切关注点,如日志记录、缓存等,并将域对象编排到视图模型中。当您有多个客户端(例如Web API和MVC)并且用例响应涉及多个事务资源时,它们特别有用(请参阅Martin Fowler的企业应用程序架构模式中的“服务层”部分)


应用程序服务可以包含对存储库的调用,以获取填充有数据的域对象,然后它们可以调用域对象或域服务上的某些方法,并再次调用存储库以持久化修改后的域对象。它们通常比域服务“更广泛”,因为它们包含整个用例。

@BornToCode如果跨域跨功能,那么是的