服务器部署测试~~~
This commit is contained in:
45
Filters/ValidationFilter.cs
Normal file
45
Filters/ValidationFilter.cs
Normal file
@@ -0,0 +1,45 @@
|
||||
// Filters/ValidationFilter.cs
|
||||
|
||||
using FluentValidation;
|
||||
|
||||
// 这是一个可复用的通用过滤器,T 是我们要验证的模型类型
|
||||
public class ValidationFilter<T> : IEndpointFilter where T : class
|
||||
{
|
||||
private readonly IValidator<T> _validator;
|
||||
|
||||
// 过滤器可以通过构造函数注入它需要的服务,这里我们注入对应的验证器
|
||||
public ValidationFilter(IValidator<T> validator)
|
||||
{
|
||||
_validator = validator;
|
||||
}
|
||||
|
||||
public async ValueTask<object?> InvokeAsync(
|
||||
EndpointFilterInvocationContext context,
|
||||
EndpointFilterDelegate next)
|
||||
{
|
||||
// 1. 从端点参数中找到我们需要验证的对象
|
||||
// 我们假设它总是第一个参数,如果不是,可以修改这里的逻辑
|
||||
var validationTarget = context.Arguments.FirstOrDefault(a => a?.GetType() == typeof(T)) as T;
|
||||
|
||||
// 如果在参数中找不到该类型的对象,直接跳过验证
|
||||
if (validationTarget is null)
|
||||
{
|
||||
// 或者可以返回一个错误,这取决于你的业务需求
|
||||
// return Results.BadRequest("Could not find validation target in request.");
|
||||
return await next(context);
|
||||
}
|
||||
|
||||
// 2. 使用从DI容器注入的验证器进行验证
|
||||
var validationResult = await _validator.ValidateAsync(validationTarget);
|
||||
|
||||
// 3. 如果验证失败,立即中断请求并返回一个标准的400 ValidationProblem
|
||||
if (!validationResult.IsValid)
|
||||
{
|
||||
// 将 FluentValidation 的错误结果转换为 ASP.NET Core 标准的错误响应
|
||||
return Results.ValidationProblem(validationResult.ToDictionary());
|
||||
}
|
||||
|
||||
// 4. 如果验证成功,则继续执行后续的过滤器或端点本身
|
||||
return await next(context);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user