ASP.NET Core 集成示例
本章节将基于刚才的自定义验证框架,为它 写一套完整的 ASP.NET Core 集成示例。你可以将其无缝集成进 Web API 项目中,替代或补充 ASP.NET Core 默认的模型验证。
项目结构
ValidationFramework/
├── Attributes/
├── Interfaces/
├── Models/
├── Validators/
└── ValidationFramework.csproj
WebApiSample/
├── Controllers/
│ └── UsersController.cs
├── Models/
│ └── UserDto.cs
├── Filters/
│ └── CustomValidationFilter.cs
└── WebApiSample.csproj
第一步:引用验证框架
在 ASP.NET Core 项目的 .csproj 文件中添加引用:
<ProjectReference Include="..\ValidationFramework\ValidationFramework.csproj" />
第二步:定义请求模型 UserDto
// Models/UserDto.cs
using ValidationFramework.Attributes;
public class UserDto
{
[Required(ErrorMessage = "用户名不能为空")]
[MaxLength(10, ErrorMessage = "用户名最长为10个字符")]
public string Username { get; set; }
[CustomValidator(typeof(EmailValidator))]
public string Email { get; set; }
}
第三步:创建自定义 Action 过滤器
// Filters/CustomValidationFilter.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using ValidationFramework.Validators;
using ValidationFramework.Models;
public class CustomValidationFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
foreach (var arg in context.ActionArguments.Values)
{
if (arg == null) continue;
ValidationResult result = ValidationEngine.Validate(arg);
if (!result.IsValid)
{
context.Result = new BadRequestObjectResult(new
{
Message = "参数验证失败",
Errors = result.Errors
});
return;
}
}
}
public void OnActionExecuted(ActionExecutedContext context) { }
}
第四步:控制器使用验证
// Controllers/UsersController.cs
using Microsoft.AspNetCore.Mvc;
using WebApiSample.Models;
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
[HttpPost]
public IActionResult CreateUser([FromBody] UserDto userDto)
{
return Ok(new { Message = "用户创建成功", User = userDto });
}
}
第五步:在 Program.cs 中注册验证过滤器
// Program.cs (.NET 6/7/8)
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
options.Filters.Add<CustomValidationFilter>(); // 注册验证过滤器
});
var app = builder.Build();
app.MapControllers();
app.Run();
示例测试
请求示例:
POST /api/users
Content-Type: application/json
{
"username": "",
"email": "notanemail"
}
响应示例:
{
"message": "参数验证失败",
"errors": [
"用户名不能为空",
"邮箱格式不正确"
]
}
高级扩展建议
| 功能 | 做法 |
|---|---|
| 只验证特定 DTO 类型 | 在 CustomValidationFilter 中用 Type.IsDefined 判断是否含某自定义 [Validatable] 特性 |
| 分组验证 | 在特性中添加 Group 属性,在引擎中按需处理 |
| 属性递归验证 | 在 ValidationEngine 中对复杂类型递归调用自身 |
| 配合 Swagger 展示验证信息 | 通过 IApiDescriptionProvider 注入提示(可扩展) |
参考资料
总结
这个集成方案:
- 零侵入性(不修改现有控制器逻辑)
- 自定义验证逻辑可控性强
- 支持复杂规则、插件式扩展
- 可替代 FluentValidation 或 DataAnnotations 体系
更多详细内容请关注其他相关文章!