基于 ABP 实现 DDD-- 领域服务、应用服务和 DTO 实践

本文介绍了如何在ABP框架中实现领域驱动设计(DDD)的领域服务、应用服务和数据传输对象(DTO)的实践。领域服务实践通过将Issue的AssignToAsync()方法剥离到领域服务中,应用服务则涉及DTO的输入和输出,以及领域逻辑和应用逻辑的区分。DTO实践包括输入和输出DTO的最佳实践,强调不暴露实体结构,以及对象映射工具如AutoMapper的使用,但官方建议仅对输出DTO做自动对象映射。
摘要由CSDN通过智能技术生成

什么是领域服务呢?领域服务就是领域对象本身的服务,通常是通过多个聚合以实现单个聚合无法处理的逻辑。

一.领域服务实践

接下来将聚合根 Issue 中的 AssignToAsync()方法[将问题分配给用户],剥离到领域服务当中。如下:

// ABP当中的领域服务类通常都是以Manager结尾的
public class IssueManager : DomainService
{
  
private readonly IRepository<Issue,Guid> _issueRepository;
// 在构造函数中注入需要的仓储
public IssueManager(IRepository<Issue,Guid> issueRepository)
{
  
_issueRepository = issueRepository;
}
public async Task AssignToAsync(Issue issue, AppUser user)
{
  
// 通过仓储获取分配给该用户的,并且没有关闭的Issue的数量
var openIssueCount = await _issueRepository.CountAsync(i => i.AssignedUserId == user.id && !i.IsClosed);
// 如果超过3个,那么抛出异常
if (openIssueCount > 3)
{
  
throw new BusinessException("IssueTracking:ConcurrentOpenIssueLimit");
}
issue.AssignedUserId = user.Id;
}
}

需要说明的是通常不需要为领域服务 IssueManager 在创建一个接口 IIssueManager。

二.应用服务实践

应用服务的输入和输出通常都是 DTO,其中的难点是区分领域逻辑和应用逻辑,即哪些服务放在领域层实现,哪些服务放在应用层来实现。

namespace IssueTracking.Issues{
      public class IssueAppService :ApplicationService.IIssueAppService    {
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值