如何验证 CQRS 查询
How to validate CQRS query
我正在开发一个 APS.NET 核心 MVC Web 应用程序,我有两个问题。
- 如何在执行之前验证(使用 FluentValidation)CQRS 查询?
- 当 FluentValidation 失败时如何将用户重定向到错误页面(例如 404 页面)?
第一题描述
在没有 CQRS 的情况下,我使用以下方法通过 ID 获取标签,如果找不到标签,它只是 returns 未找到结果:
public async Task<IActionResult> Edit(int id)
{
var tag = await _unitOfWork.Tags.GetAsync(id);
if (tag is null)
return NotFound();
return View(tag);
}
对于 CQRS,我使用以下代码:
// CQRS Query
public class GetTagByIdQuery : IRequest<Tag>
{
public int Id { get; set; }
public class GetTagByIdQueryHandler : IRequestHandler<GetTagByIdQuery, Tag>
{
private readonly IUnitOfWork _unitOfWork;
public GetTagByIdQueryHandler(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public async Task<Tag> Handle(GetTagByIdQuery request, CancellationToken cancellationToken)
{
return await _unitOfWork.Tags.GetAsync(request.Id);
}
}
}
// Action method
public async Task<IActionResult> Edit(int id)
{
return View(await _mediator.Send(new GetTagByIdQuery { Id = id }));
}
如何确保给定的 ID 有效?
第二题描述
例如:
如果用户请求标签 ID 无效的标签:
https://localhost:44343/admin/tags/edit/80
我想将用户重定向到 404 错误页面。
对于这两个问题,当tag ID无效时,查询结果都会为null,所以我们可以这样处理:
public async Task<IActionResult> Edit(int id)
{
var query = new GetTagByIdQuery { Id = id };
var result = await _mediator.Send(query);
return result is not null ? View(result) : (IActionResult)NotFound();
}
我正在开发一个 APS.NET 核心 MVC Web 应用程序,我有两个问题。
- 如何在执行之前验证(使用 FluentValidation)CQRS 查询?
- 当 FluentValidation 失败时如何将用户重定向到错误页面(例如 404 页面)?
第一题描述
在没有 CQRS 的情况下,我使用以下方法通过 ID 获取标签,如果找不到标签,它只是 returns 未找到结果:
public async Task<IActionResult> Edit(int id)
{
var tag = await _unitOfWork.Tags.GetAsync(id);
if (tag is null)
return NotFound();
return View(tag);
}
对于 CQRS,我使用以下代码:
// CQRS Query
public class GetTagByIdQuery : IRequest<Tag>
{
public int Id { get; set; }
public class GetTagByIdQueryHandler : IRequestHandler<GetTagByIdQuery, Tag>
{
private readonly IUnitOfWork _unitOfWork;
public GetTagByIdQueryHandler(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public async Task<Tag> Handle(GetTagByIdQuery request, CancellationToken cancellationToken)
{
return await _unitOfWork.Tags.GetAsync(request.Id);
}
}
}
// Action method
public async Task<IActionResult> Edit(int id)
{
return View(await _mediator.Send(new GetTagByIdQuery { Id = id }));
}
如何确保给定的 ID 有效?
第二题描述
例如:
如果用户请求标签 ID 无效的标签:
https://localhost:44343/admin/tags/edit/80
我想将用户重定向到 404 错误页面。
对于这两个问题,当tag ID无效时,查询结果都会为null,所以我们可以这样处理:
public async Task<IActionResult> Edit(int id)
{
var query = new GetTagByIdQuery { Id = id };
var result = await _mediator.Send(query);
return result is not null ? View(result) : (IActionResult)NotFound();
}