ASP.NET Core 集成示例
                           
天天向上
发布: 2025-04-19 10:02:57

原创
800 人浏览过

本章节将基于刚才的自定义验证框架,为它 写一套完整的 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 体系

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *