c# - 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
保存记录。否则,在我的测试项目中,下面的代码返回tag
null Id
。
var tag = await _tagAppService.CreateTag(new CreateTagInput
{
Value = createTag
});
解决方案
不要禁用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);
}
推荐阅读
- c++ - 试图将 3d 数组传递给函数 c++
- ruby - 在同一行接收值
- c# - 从 .NET Framework 4.6 迁移到 .NET5 后,API 帖子正文为空
- node.js - 使用mongodb在nodejs中使用锁定/事务读取和插入文档
- sql - 如何在 Oracle 中使用 current_timestamp 指定时区
- go - 无法将 go 应用程序推送到 heroku - 构建失败
- visual-studio-code - 为什么 Prettier 扩展在 VS Code 中不起作用?
- binance - Binance api python + 或使用某些应用程序进行买卖的任何其他建议
- javascript - 即使 .then 已解决,为什么我的 catch 语句仍会触发?
- ios - Flutter Health Steps Data, Datatype 可能抛出导致 UI 崩溃的错误