首页 > 解决方案 > AppService 返回具有空 Id 的 DTO

问题描述

我正在实现 AppService 和 DomainService。

域服务:

public class TagsManager : IDomainService
{
    private readonly IRepository<Tag, long> _tagRepository;
    private readonly IUnitOfWorkManager _unitOfWorkManager;

    public TagsManager(IRepository<Tag, long> tagRepository, IUnitOfWorkManager unitOfWorkManager)
    {
        _tagRepository = tagRepository;
        _unitOfWorkManager = unitOfWorkManager;
    }

    public IQueryable<Tag> Tags
    {
        get { return _tagRepository.GetAll(); }
    }
}

在 AppService 中使用 DomainService 时:

[UnitOfWork(IsDisabled = true)]
public async Task<TagDto> CreateTag(CreateTagInput input)
{
    var existing = await _tagsManager.Tags.Where(p => p.Type == input.Type && p.Value == input.Value.Trim()).FirstOrDefaultAsync();
    if (existing != null) throw new UserFriendlyException(L("ExistedRepeatedTag"));
    var newEntity = ObjectMapper.Map<Tag>(input);
    await _tagsManager.CreateTag(newEntity);
    return ObjectMapper.Map<TagDto>(newEntity);
}

它会抛出异常:

无法访问已处置的对象。此错误的一个常见原因是释放从依赖注入中解析的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文上调用 Dispose() 或将上下文包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器负责处理上下文实例。

如果我注释掉[UnitOfWork(IsDisabled = true)],我需要_unitOfWorkManager保存记录。否则,在我的测试项目中,下面的代码返回tagnull Id

var tag = await _tagAppService.CreateTag(new CreateTagInput
{
    Value = createTag
});

标签: c#automapperdtounit-of-workasp.net-boilerplate

解决方案


不要禁用UnitOfWork. 您需要SaveChanges在映射之前调用。

// [UnitOfWork(IsDisabled = true)]
public async Task<TagDto> CreateTag(CreateTagInput input)
{
    var existing = await _tagsManager.Tags.Where(p => p.Type == input.Type && p.Value == input.Value.Trim()).FirstOrDefaultAsync();
    if (existing != null) throw new UserFriendlyException(L("ExistedRepeatedTag"));
    var newEntity = ObjectMapper.Map<Tag>(input);
    await _tagsManager.CreateTag(newEntity);

    // await _unitOfWorkManager.Current.SaveChangesAsync();
    await CurrentUnitOfWork.SaveChangesAsync();

    return ObjectMapper.Map<TagDto>(newEntity);
}

推荐阅读