😺

FluentValidationでカスタムバリデータを作成する

2021/10/07に公開

.NETのバリデーションライブラリである FluentValidation で、独自ルールのバリデーションを作って使い回せるようにする方法を記載する。

基本的には、Predicate Validator を使用するのがよい。

Predicate Validator によるカスタムバリデータの作成

FluentValidation の IRuleBuilder の拡張メソッドで Predicate Validator として作成する。
Must に対する条件式としてカスタムバリデータのルールを記載する。

定義

public static IRuleBuilderOptions<T, string> IsAlphabetic<string>(this IRuleBuilder<T, string> ruleBuilder)
{
    return ruleBuilder
        .Must((str) => Regex.IsMatch(str, ^[A-z]+$"))
	.WithMessage("アルファベット以外の文字が含まれています。");
}

使用例

RuleFor(x => x.FirstName).IsAlphabetic();

公式サイト predicate-validator

https://docs.fluentvalidation.net/en/latest/custom-validators.html#predicate-validator

PropertyValidator によるカスタムバリデータの作成

別の方法として、PropertyValidator を使ってバリデータを作成する方法もある。

public class IsAlphabeticValidator : PropertyValidator
{
    public IsAlphabeticValidator() {
    }

    protected override bool IsValid(PropertyValidatorContext context)
    {
        return Regex.IsMatch(context.PropertyValue?.ToString() ?? "", "^[A-z]+$")
    }
}

FluentValidator 10.0 でジェネリックスを利用することもできるようになった。

RuleFor(x => x.FirstName).SetValidator(new IsAlphabeticValidator())

PropertyValidator の利用はなるべく避ける

Predicate Validator の方が簡潔に書け、型の間違いに気づきやすいなどの利点もある。

reusable-property-validators

https://docs.fluentvalidation.net/en/latest/custom-validators.html#reusable-property-validators

公式サイトにも通常は不要であると記載がある。

This is an advanced technique that is usually unnecessary - the Must and Custom methods explained above are usually more appropriate.

Discussion