首页
/ FluentValidation 支持内部验证器注册的技术解析

FluentValidation 支持内部验证器注册的技术解析

2025-05-25 12:52:09作者:鲍丁臣Ursa

背景介绍

FluentValidation 是一个流行的.NET验证库,它通过流畅的接口定义验证规则,使验证逻辑更加清晰和可维护。在实际开发中,开发者经常需要将验证器与命令/请求类组织在一起,形成垂直切片架构。

问题场景

在C# 10引入了文件作用域命名空间(file-scoped namespace)和文件局部类型(file-local type)后,开发者希望进一步封装实现细节,将验证器类标记为file作用域或internal访问级别。然而,FluentValidation默认只扫描并注册public类型的验证器,这限制了代码组织的灵活性。

解决方案

FluentValidation 提供了扩展方法来支持注册内部类型的验证器:

// 方式1:通过包含类型扫描程序集
services.AddValidatorsFromAssemblyContaining<MyValidator>(includeInternalTypes: true);

// 方式2:直接指定程序集
services.AddValidatorsFromAssembly(someAssembly, includeInternalTypes: true);

技术实现细节

  1. 参数说明

    • includeInternalTypes参数设置为true时,扫描器会包含程序集中的internal类型
    • 这同样适用于file作用域的类型,因为它们在编译后实际上就是internal类型
  2. 架构影响

    • 允许更严格的封装,验证器可以完全隐藏在实现细节中
    • 支持垂直切片架构中"邻近原则"的更好实践
    • 减少公共API表面积,提高模块化程度
  3. 使用建议

    • 在垂直切片架构中,可以将验证器与处理器放在同一文件中
    • 适用于领域驱动设计中的限界上下文实现
    • 特别适合CQRS模式中的命令验证

最佳实践

  1. 代码组织
// 公共契约
public static class Add {
    public sealed class Command : IRequest;
}

// 实现细节(同一文件)
file sealed class CommandHandler : IRequestHandler<Command>;
file sealed class CommandValidator : AbstractValidator<Add.Command>;
  1. 依赖注册
// 在启动配置中
builder.Services.AddValidatorsFromAssemblyContaining<Program>(includeInternalTypes: true);

注意事项

  1. 确保验证器确实需要隐藏为内部实现,而不是作为公共契约的一部分
  2. 在跨程序集场景下,内部类型仍然会受到访问限制
  3. 测试项目需要通过InternalsVisibleTo属性来访问这些验证器进行单元测试

通过这种机制,FluentValidation为现代C#代码组织方式提供了更好的支持,使开发者能够在保持代码整洁性的同时,不牺牲架构的灵活性。

登录后查看全文
热门项目推荐
相关项目推荐