Stay Hungry,Stay Foolish!

Introduction to FluentValidation

Introduction to FluentValidation

https://jdaniel1987.github.io/FluentValidation

 

这篇文章写得非常清晰,涵盖了从基础安装到结合 Minimal API 和 MediatR 的高级用法。为了让你转载到博客时效果更好,我特意保留了代码块,并对关键术语做了润色,读起来会更顺畅。


📝 博客文章草稿

标题: FluentValidation 简介:编写更具表现力的 .NET 验证逻辑
作者: Jaime Daniel Delgado Ortega
发布时间: 2024年9月12日
阅读时间: 3 分钟


引言

在应用开发的世界里,在处理数据之前确保其有效性至关重要。这正是 FluentValidation 的用武之地,它为 .NET 应用程序提供了一种强大而灵活的方式来处理验证逻辑。

FluentValidation 是一个流行的库,它提供了一个流畅的接口来为您的对象定义验证规则。它帮助您将验证逻辑与业务逻辑分离开来,使代码更清晰、更易于维护。

FluentValidation 的优势

  • 流畅的接口 (Fluent Interface): 它使用流畅的接口,允许您以清晰且富有表现力的方式构建验证规则。
  • 关注点分离 (Separation of Concerns): 验证规则与业务逻辑分离,有助于构建干净、有条理的代码库。
  • 可扩展性 (Extensibility): FluentValidation 具有高度的可扩展性,允许您根据需要创建自定义验证器和规则。
  • 集成性 (Integration): 它能与 ASP.NET Core 和其他 .NET 框架无缝集成,并提供对依赖注入的内置支持。
  • 可测试性 (Testability): 验证逻辑可以独立于业务逻辑进行测试,从而提高应用程序的可靠性。

使用示例

以下是将 FluentValidation 集成到项目中的具体步骤。

1. 安装 NuGet 包

要开始使用 FluentValidation,请安装 FluentValidation NuGet 包。在您的项目中,右键单击 -> 管理 NuGet 包,搜索“FluentValidation”,然后点击安装。

[图片占位:NuGet 包管理器安装 FluentValidation 的截图]
(建议在此处插入一张显示在 Visual Studio 中搜索并安装 FluentValidation 包的截图)

2. 创建请求对象

定义您想要验证的对象。例如,创建一个 CreateUserRequest 类:

public class CreateUserRequest
{
    public string Name { get; set; }
    public string Email { get; set; }
}

3. 定义验证器

通过继承 AbstractValidator<T> 来创建一个验证器,其中 T 是您要验证的对象类型。在构造函数中定义您的规则。

using FluentValidation;

public class CreateUserRequestValidator : AbstractValidator<CreateUserRequest>
{
    public CreateUserRequestValidator()
    {
        RuleFor(x => x.Name)
            .NotEmpty()
            .WithMessage("Name is required.");

        RuleFor(x => x.Email)
            .NotEmpty()
            .EmailAddress()
            .WithMessage("A valid email is required.");
    }
}

4. 在 Program.cs 中注册 FluentValidation

要将 FluentValidation 与您的 ASP.NET Core 应用程序集成,请在 Program.cs 文件中使用 FluentValidation.AspNetCore 提供的扩展方法进行注册。

builder.Services.AddControllers()
    .AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<CreateUserRequestValidator>());

5. 在控制器或 Minimal API 中使用 FluentValidation

在控制器中,当您使用模型绑定时,验证会自动应用。例如:

[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    [HttpPost]
    public IActionResult CreateUser([FromBody] CreateUserRequest request)
    {
        // 如果验证失败,会自动返回一个 400 Bad Request 响应
        // 并附带验证错误信息。
        return Ok();
    }
}

对于 Minimal APIs,您需要手动验证请求:

app.MapPost("/api/users", async (CreateUserRequest request, IValidator<CreateUserRequest> validator) =>
{
    var result = await validator.ValidateAsync(request);
    if (!result.IsValid)
    {
        return Results.BadRequest(result.Errors);
    }

    // 处理有效的请求
    return Results.Ok();
})
.WithName("CreateUser")
.WithOpenApi();

Minimal APIs 的小技巧

如果您在 Minimal APIs 中同时使用 MediatR,可以引入 MediatR.Extensions.FluentValidation.AspNetCore 包。这样,当您通过 _mediator.Send(...) 发送命令/查询/请求时,它会自动进行验证。

services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()));
services.AddValidatorsFromAssemblyContaining<CreateUserRequestValidator>();
services.AddFluentValidation([typeof(CreateUserRequestValidator).Assembly]);

6. 自定义验证规则 (可选)

FluentValidation 允许您为更复杂的场景创建自定义验证规则。

public class CustomValidation : AbstractValidator<CreateUserRequest>
{
    public CustomValidation()
    {
        RuleFor(x => x.Name)
            .Must(BeAValidName)
            .WithMessage("Invalid name.");
    }

    private bool BeAValidName(string name)
    {
        // 自定义验证逻辑
        return !string.IsNullOrWhiteSpace(name);
    }
}

结论

FluentValidation 为处理 .NET 应用程序中的验证提供了一种强大而灵活的方式。通过将验证规则与业务逻辑分离,它有助于保持代码库的整洁和有序。在您的项目中开始使用 FluentValidation,以确保数据有效且代码易于维护!


标签: #C# #.NET #FluentValidation #Validation

(本文根据 CC BY 4.0 许可协议发布)

posted @ 2026-08-28 12:10  lightsong  阅读(4)  评论(0)    收藏  举报
千山鸟飞绝,万径人踪灭