关于使用 DomainService
Posted
技术标签:
【中文标题】关于使用 DomainService【英文标题】:About using DomainService 【发布时间】:2021-07-19 17:04:56 【问题描述】:-
我无法完全理解在哪种情况下我将使用 DomainService 和
在这种情况下,ApplicationService。你的文件不详细
这个话题就够了。你能给出更详细的解释吗
举个例子?
如果我只使用 ApplicationService 而从不使用会出现什么问题
使用 DomainService。
DomainService中应该做哪些操作?
我应该遵循什么样的方法来区分这两者
彼此提供服务。
【问题讨论】:
【参考方案1】:简短回答:仅当您需要额外的抽象级别时才使用域服务。
长答案如下。
1。什么时候使用域服务?
来自文档Domain Services #Introduction:
在以下情况下特别需要创建域服务;
您实现了依赖于某些服务(如存储库或其他外部服务)的核心域逻辑。 您需要实现的逻辑与多个聚合/实体相关,因此它不适合任何聚合。
来自文档Domain Services #Introduction 的示例:将问题分配给用户时,检查分配的问题数量是否不超过或等于特定数量。
教程Part 6: Authors: Domain layer 中的示例:更改作者姓名时,请检查是否没有具有给定姓名的作者。
2。如果我不使用域服务会出现什么问题?
您可能会错过作为核心域逻辑或业务规则的检查。
但一般来说,没问题。来自教程Part 6: Authors: Domain layer:
DDD 提示:除非确实需要并执行一些核心业务规则,否则不要引入域服务方法。
3。域服务应该做哪些操作?
参见 #1 和 #4 中的示例。
4。如何区分域服务和应用服务?
来自文档Domain Services #Application Services vs Domain Services:
虽然应用服务和领域服务都实现了业务规则,但存在根本的逻辑和形式差异; 应用程序服务实现应用程序的用例(典型 Web 应用程序中的用户交互),而域服务实现独立于用例的核心域逻辑。 应用服务获取/返回数据传输对象,域服务方法通常获取和返回域对象(实体、值对象)。 域服务通常由应用程序服务或其他域服务使用,而应用程序服务由表示层或客户端应用程序使用。
来自教程Part 8: Author: Application Layer:
使用AuthorManager
(域服务)创建新作者。 使用IAuthorRepository.InsertAsync
将新作者插入数据库。 使用ObjectMapper
返回代表新创建作者的AuthorDto
。DDD 提示:一些开发人员可能会发现在
_authorManager.CreateAsync
中插入新实体很有用。我们认为将其留给应用程序层是更好的设计,因为它更好地知道何时将其插入数据库(也许它需要在插入之前对实体进行额外的工作,如果我们执行插入则需要额外的更新域服务)。不过,这完全取决于您。
【讨论】:
【参考方案2】:@aaron'a 答案很棒。我只想指出另一个讨论“域服务与应用程序服务”的文档:https://docs.abp.io/en/abp/latest/Domain-Driven-Design-Implementation-Guide#domain-logic-application-logic
如果您想使用 ABP 框架实现 DDD,我建议您完整阅读本指南。如果你仍然觉得文档不够详细,可以阅读 Eric Evans 的 Domain-Driven Design 一书。 DDD 不是由 ABP 框架创建的概念,网络上有大量资源和许多书籍。
【讨论】:
以上是关于关于使用 DomainService的主要内容,如果未能解决你的问题,请参考以下文章