其他分享
首页 > 其他分享> > 实现领域驱动设计 - 使用ABP框架 - 更新操作实体

实现领域驱动设计 - 使用ABP框架 - 更新操作实体

作者:互联网

用例演示 - 更新 / 操作实体

一旦一个实体被创建,它将被用例更新/操作,直到它从系统中删除。可以有不同类型的用例直接或间接地更改实体

在本节中,我们将讨论更改 Issue 的多个属性的典型更新操作。

这次,从更新DTO开始:

public class UpdateIssueDto
{
    [Required]
    public string Title { get; set; }
    public string Text { get; set; }
    public Guid? AssignedUserId { get; set; }
}

通过与 IssueCreationDto 比较,您看不到 RepositoryId 。因为,我们的系统不允许跨仓库移动问题(想想GitHub仓库)。只有 Title 是必需的,其他属性是可选的

让我们看看 IssueAppService 中的 Update 实现:

public class IssueAppService : ApplicationService, IIssueAppService
{
    //省略了依赖注入

    public async Task<IssueDto> UpdateAsync(Guid id, UpdateIssueDto input)
    {
        //从数据库获取问题实体
        var issue = await _issueRepository.GetAsync(id);

        //修改标题
        await _issueManager.ChangeTitleAsync(issue, input.Title);

        //修改分配人
        if(input.AssignedUserId.HasValue)
        {
            var user = await _userRepository.GetAsync(input.AssignedUserId.Value);
            await _issueManager.AssignToAsync(issue, user);
        }

        //修改内容 (没有业务规则,接受任何内容)
        issue.Text = input.Text;

        // 更新实体到数据库
        await _issueRepository.UpdateAsync(issue);

        //返回表示这个新的问题的DTO
        return ObjectMapper.Map<Issue, IssueDto>(issue);
    }
}

如前所述,我们需要对 IssueIssueManager 类进行一些更改。

首先,在 Issue 类中设置 SetTitle 为 internal:

internal void SetTitle(string title)
{
     Title = Check.NotNullOrWhiteSpace(title, nameof(title));
}

然后在 IssueManager 中添加了一个新方法来更改标题:

public async Task ChangeTitleAsync(Issue issue, string title)
{
    if(issue.Title == title)
    {
        return;
    }

    //如果存在相同标题的问题,直接抛错
    if(await _issueRepository.AnyAsync(i => i.Title == title))
    {
        throw new BusinessException("IssueTracking:IssueWithSameTitleExists");
    }

    issue.SetTitle(title);
}

标签:框架,Title,issue,title,ABP,IssueManager,驱动,Issue,public
来源: https://www.cnblogs.com/broadm/p/16408006.html