tnblog
首页
视频
资源
登录
什么时候才能领悟,取之越多失之越多
排名
5
文章
229
粉丝
15
评论
7
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

领域启动设计DDD 应用服务与领域服务区别

5737人阅读 2022/5/22 20:30 总访问:1098589 评论:0 收藏:1 手机
分类: 架构

1.领域服务和Application Services 是不同的,Application Services 返回的是DTO,而领域服务返回的是领域对象(实体或者值类型)。

2.领域服务可以被应用服务和其它的领域服务调用,但是不可以被表现层直接调用(表现层可以直接调用应用服务)。

第二点就是tmd为什么我 表现层 想引用 领域服务 失败的原因。DDD是有分层架构的,每一层都有流向性!!!!!!!!

重点:项目中看到 xxxxxManger.cs 结尾的 就是 领域服务的命名约定

切记三步走:

1.创建接口

  1. public interface ITaskManager : IDomainService
  2. {
  3. void AssignTaskToPerson(Task task, Person person);
  4. }

2.实现服务

  1. public class TaskManager : DomainService, ITaskManager
  2. {
  3. public const int MaxActiveTaskCountForAPerson = 3;
  4. private readonly ITaskRepository _taskRepository;
  5. public TaskManager(ITaskRepository taskRepository)
  6. {
  7. _taskRepository = taskRepository;
  8. }
  9. public void AssignTaskToPerson(Task task, Person person)
  10. {
  11. if (task.AssignedPersonId == person.Id)
  12. {
  13. return;
  14. }
  15. if (task.State != TaskState.Active)
  16. {
  17. throw new ApplicationException("Can not assign a task to a person when task is not active!");
  18. }
  19. if (HasPersonMaximumAssignedTask(person))
  20. {
  21. throw new UserFriendlyException(L("MaxPersonTaskLimitMessage", person.Name));
  22. }
  23. task.AssignedPersonId = person.Id;
  24. }
  25. private bool HasPersonMaximumAssignedTask(Person person)
  26. {
  27. var assignedTaskCount = _taskRepository.Count(t => t.State == TaskState.Active && t.AssignedPersonId == person.Id);
  28. return assignedTaskCount >= MaxActiveTaskCountForAPerson;
  29. }
  30. }
  1. 应用层调用领域服务

下面示例为我们展示了应用层是如何调用TaskMananger

任务服务层用给定的DTO和仓储资源去检索相关的Task和Person,并且将检索到的结果传递给TaskMananger(领域服务)。

  1. public class TaskAppService : ApplicationService, ITaskAppService
  2. {
  3. private readonly IRepository<Task, long> _taskRepository;
  4. private readonly IRepository<Person> _personRepository;
  5. private readonly ITaskManager _taskManager;
  6. public TaskAppService(IRepository<Task, long> taskRepository, IRepository<Person> personRepository , ITaskManager taskManager)
  7. {
  8. _taskRepository = taskRepository;
  9. _personRepository = personRepository;
  10. _taskManager = taskManager;
  11. }
  12. public void AssignTaskToPerson(AssignTaskToPersonInput input)
  13. {
  14. var task = _taskRepository.Get(input.TaskId);
  15. var person = _personRepository.Get(input.PersonId);
  16. _taskManager.AssignTaskToPerson(task, person);
  17. }
  18. }


1.为什么不只在应用层实现这些逻辑?
你可能会说为什么不在服务层来实现领域服务里面的业务逻辑。

我们可以简单的说因为这根本不是应用层的任务。因为它不是一个use-case(用例),而是一个业务操作。我们可以用同样(分配任务给用户)的逻辑在不同的用例中。 我们可能会有另外的应用场景,以某种方式更新任务并且这个更新可能包含了分配任务给另外的人。所以,我们可以在这里用相同的领域逻辑。(说白了就是业务规则重用)还有就是,我们可以有2中不同的UI(手持设备应用和Web应用)可以共享相同的领域。

如果你的业务领域相对简单,那么你可以不考虑使用领域服务来实现这些逻辑。在DDD模式中这不是一个最佳实践,但ABP不会强迫你使用这种设计模式。

原文链接:https://blog.csdn.net/dongnihao/article/details/124230454


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

领域启动设计DDD 领域服务与应用服务的区别

在这篇文章中,我们将看一下领域域服务与应用服务有什么不同。 人们常说,领域服务是承载那些不自然地适合实体和值对象的...

DDD介绍

领域服务(Domain Services)领域中的一些概念不太适合建模为对象,即归类到实体对象或值对象,因为它们本质上就是一些操作,...

领域驱动设计DDD的一点理解

有人误认为项目架构中加入xxRepository,xxDomain,xxValueObject就变成了DDD架构。如果没有悟出其精髓就在项目中加入这些...

深入理解DDD的聚合模式

[TOC]DDD中的聚合模式是最难弄清楚的一种模式,在如何确定聚合边界这个问题上,更没有一个明确的指导原则,这导致DDD的落地...

领域驱动设计DDD ABP VNext 一:项目架构搭建,模块使用

[TOC]用户接口层改造nuget中下载abp依赖VoLo.Abp.AspNetCore.Mvc ItemGroup添加方式 &lt;ItemGroup&gt; &lt;Packa...

领域驱动设计DDD之Repository

DDD中的Repository模式Repository模式也称存储库模式或仓储模式,根据Eric Evans的《领域驱动设计》一书,“存储库是一种封...

领域驱动设计DDD ABP VNext 二:使用仓储

[TOC]领域驱动设计仓储介绍在领域层和数据映射层之间进行中介,使用类似集合的接口来操作领域对象.” (Martin Fowler)。 实...

领域驱动设计DDD ABP VNext 三:领域模型 之 失血模型,贫血模型,充血模型,胀血模型

[TOC]领域模型分为:失血模型,贫血模型,充血模型,胀血模型。 一、失血模型传统的三层架构,实体对象就是简单的POJO或者...

基础领域驱动DDD框架搭建,配合sqlsugar基础架构搭建。使用仓储。.net使用Autofac实现自动注入

[TOC]一:创建一个WebApi项目随便取名一个,比如TeacherCertificationAPI效果如下: 顺便在appsettings.json中配置一下...