什么是领域服务呢?领域服务就是领域对象本身的服务,通常是通过多个聚合以实现单个聚合无法处理的逻辑。
一.领域服务实践
接下来将聚合根 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
{