IAM使用流畅的验证和使用MediatR库的CQRS.我的解决方案中使用了以下Fluent包版本以及.NET 7和C#.

FluentValidation-11.8.1

FluentValidation.DependencyInjectionExtensions-11.8.1

我有以下针对"Group"属性的验证器,该属性是CreateGroupRequestUpdateGroupRequest中的"字符串"数据类型.

public class CreateGroupRequest : IRequest<BaseResponse<CreateGroupResponse>>
{
    public string Group { get; set; }
}

public class CreateGroupValidator : AbstractValidator<CreateGroupRequest>
{
    public CreateGroupValidator(IOptions<FeatureOptions> options)
    {
        var featureOptions = options.Value;

        ClassLevelCascadeMode = CascadeMode.Stop;

        RuleFor(r => r.Group).NotNull().WithMessage("Group can't be null.");

        RuleFor(r => r.Group).NotEmpty().WithMessage("Group must not be empty.");

        RuleFor(r => r.Group).Length(featureOptions.GroupMinLength, featureOptions.GroupMaxLength)
                             .WithMessage("Group length must be between 1 and 15.");

        RuleFor(r => r.Group).Matches(featureOptions.GroupAllowedCharactersRegex)
                             .WithMessage("Group must start and end with lower case letters or numbers. It may contain \"_\" and \" - \".");
    }
}


public class UpdateGroupValidator : AbstractValidator<UpdateGroupRequest>
{
    public UpdateGroupValidator(IOptions<FeatureOptions> options)
    {
        var featureOptions = options.Value;

        ClassLevelCascadeMode = CascadeMode.Stop;

        RuleFor(r => r.Group).NotNull().WithMessage("Group can't be null.");

        RuleFor(r => r.Group).NotEmpty().WithMessage("Group must not be empty.");

        RuleFor(r => r.Group).Length(featureOptions.GroupMinLength, featureOptions .GroupMaxLength)
                             .WithMessage("Group length must be between 1 and 15.");

        RuleFor(r => r.Group).Matches(labelingOptions.GroupAllowedCharactersRegex)
                             .WithMessage("Group must start and end with lower case letters or numbers. It may contain \"_\" and \" - \".");
    }
}

我在验证器中使用ClassLevelCascadeMode = CascadeMode.Stop设置.

还有其他请求需要验证"Group"属性.有没有办法移动"Group"属性上的所有验证,以便在单个位置定义规则并在验证器中重用?

在这方面的任何帮助都是非常感谢的.

推荐答案

首先,您可以简化代码,将所有规则分组在一个声明中:

public CreateGroupValidator(IOptions<FeatureOptions> options)
{
    var featureOptions = options.Value;

    ClassLevelCascadeMode = CascadeMode.Stop;

    RuleFor(r => r.Group).NotNull().WithMessage("Group can't be null.")
                         .NotEmpty().WithMessage("Group must not be empty.")
                         .Length(featureOptions.GroupMinLength, featureOptions.GroupMaxLength).WithMessage("Group length must be between 1 and 15.")
                         .Matches(featureOptions.GroupAllowedCharactersRegex).WithMessage("Group must start and end with lower case letters or numbers. It may contain \"_\" and \" - \".");

}

UpdateGroupValidator也是一样的.


也就是说,您可以使用扩展方法进行重构:

public static class ValidationExtensions
{
    public static IRuleBuilderOptions<TCommand, TProperty?> MustBeAValidGroup<TCommand, TProperty>(this IRuleBuilder<TCommand, TProperty?> myGroup)
    {
        return myGroup.NotNull().WithMessage("Group can't be null.")
                         .NotEmpty().WithMessage("Group must not be empty.")
                         .Length(featureOptions.GroupMinLength, featureOptions.GroupMaxLength).WithMessage("Group length must be between 1 and 15.")
                         .Matches(featureOptions.GroupAllowedCharactersRegex).WithMessage("Group must start and end with lower case letters or numbers. It may contain \"_\" and \" - \".");
    }
}

然后,加上ValidationExtensions的用法,你可以在CreateGroupValidatorUpdateGroupValidator中使用它,如下所示:

[...]
RuleFor(r => r.Group).MustBeAValidGroup();
[...]

Csharp相关问答推荐

在. NET Core 8 Web API中,当为服务总线使用通用消费者时,如何防止IServiceProvider被释放或空?"

实体框架核心上是否支持使用NPGSQL的字符串聚合?

可为空的泛型属性

限制特定REST API不被访问,但部署代码

S能够用DATETIME来计算,这有什么错呢?

.NET 6控制台应用程序,RabbitMQ消费不工作时,它的程序文件中的S

实体框架核心中的ComplexType和OwnsOne有什么不同?

StackExchange.Redis.RedisServerException:调用ITransaction.ExecuteAsync()时出现错误未知命令取消监视

用C#从Word文档中删除重复的节控件和文本内容控件

如何使用NumberFormatInfo

NET8 Maui&;iOS:AppCenter崩溃错误

在C#中反序列化/序列化具有混合元素顺序的XML时出现问题

正在try 从Blazor中的API读取JSON

当使用Dapper映射DBNull时,我可以抛出异常吗?

Google OAuth令牌交换在.Net中不起作用

ASP.NET核心8:app.UseStaticFiles()管道执行顺序

嵌套Blazor组件内的验证

使用生产环境调试我的应用程序的快速方法

同时通过多个IEumable<;T&>枚举

在c#中,使用Okta和Blazor时,LocalReDirect()陷入循环,出现错误&请求太多.