Итак, я недавно начал узнавать об использовании библиотеки MediatR с веб-API ASP.NET Core, и я не уверен, как вернуть NotFound (), когда запрос DELETE / PUT / PATCH был сделан для несуществующего ресурса.
Если мы возьмем, например, DELETE, вот действие моего контроллера:
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(int id)
{
await Mediator.Send(new DeleteCourseCommand {Id = id});
return NoContent();
}
Команда:
public class DeleteCourseCommand : IRequest
{
public int Id { get; set; }
}
Обработчик команд:
public class DeleteCourseCommandHandler : IRequestHandler<DeleteCourseCommand>
{
private readonly UniversityDbContext _context;
public DeleteCourseCommandHandler(UniversityDbContext context)
{
_context = context;
}
public async Task<Unit> Handle(DeleteCourseCommand request, CancellationToken cancellationToken)
{
var course = await _context.Courses.FirstOrDefaultAsync(c => c.Id == request.Id, cancellationToken);
if (course != null)
{
_context.Courses.Remove(course);
var saveResult = await _context.SaveChangesAsync(cancellationToken);
if (saveResult <= 0)
{
throw new DeleteFailureException(nameof(course), request.Id, "Database save was not successful.");
}
}
return Unit.Value;
}
}
Как вы можете видеть в методе Handle, если при сохранении возникает ошибка, генерируется исключение, которое приводит к внутренней ошибке сервера 500 (что, я считаю, правильно). Но если курс не найден, как я могу передать это действие в контроллере? Это просто случай вызова запроса для ПОЛУЧЕНИЯ курса в действии контроллера, а затем возврата NotFound (), если он не существует, или последующего вызова команды для УДАЛЕНИЯ курса? Это, конечно, сработает, но из всех примеров, которые я рассмотрел, я не встречал Action, использующего два вызова Mediator.
Unit
? - person Kirk Larkin   schedule 22.11.2018