Я реализую 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
});