AppService возвращает DTO с нулевым идентификатором - PullRequest
0 голосов
/ 12 мая 2018

Я реализую AppService и DomainService.

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(); }
    }
}

При использовании DomainService в AppService:

[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, чтобы сохранить запись. В противном случае в моем проекте Test приведенный ниже код возвращает tag со значением NULL Id.

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

1 Ответ

0 голосов
/ 12 мая 2018

Не отключать 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);
}
...