【发布时间】:2019-04-25 07:29:09
【问题描述】:
所以我最近开始学习如何将 MediatR 库与 ASP.NET Core Web API 一起使用,但我不确定如何在对一个 DELETE/PUT/PATCH 请求发出时返回 NotFound()不存在的资源。
如果我们以 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() 或然后调用命令以删除课程?这当然可行,但在我经历过的所有示例中,我还没有遇到使用两个 Mediator 调用的 Action。
【问题讨论】:
-
什么是
Unit? -
@KirkLarkin 它是在 MediatR 库中定义的,但我仍在尝试自己解决这个问题,哈哈。我见过的很多命令示例都返回 Task
. -
Unit 只是 void 返回类型的概念。您无法定义返回 void 的接口,因此创建了 Unit。
标签: c# asp.net-core mediatr