就職・転職書類の作成でお困りの方へ
Tips
PR

【C#】Minimal API での FluentValidation 活用方法

かなむ
記事内に商品プロモーションを含む場合があります

今回は C# で利用できる「FluentValidation(フルーエント・バリデーション)」という便利なライブラリについて解説します。たとえば「名前が空欄でないか」「年齢が18歳以上100歳以下であるか」といった、入力値の確認(バリデーション)を簡潔に記述できる仕組みです。

プログラミングでは、ユーザーから受け取る情報が正しいかを確認することが非常に重要です。FluentValidation を使うことで、こうしたチェックをシンプルかつ明確に記述できます。

なお、本記事で使用するAPIは下記で構築したものです。

【C#】VSCodeでC#の最小WEB API(Minimal API)を作成する方法と仕組み
【C#】VSCodeでC#の最小WEB API(Minimal API)を作成する方法と仕組み

FluentValidation の特徴

FluentValidation は、C# でのデータバリデーション(入力チェック)を簡潔かつ可読性の高いコードで記述できるライブラリです。以下のようなチェックが容易に行えます。

  • 文字列が空でないかの確認
  • 数値が特定の範囲内かどうかの検証
  • カスタムエラーメッセージの設定

コードの可読性が高く、保守もしやすいため、業務システムなどでも広く利用されています。

インストール手順

FluentValidation をプロジェクトに追加するには、以下のコマンドを実行します。VSCodeを使用している場合は、ターミナルでプロジェクトファイル(*.csproj)があるディレクトリに移動し、コマンドを実行してください。

dotnet add package FluentValidation.AspNetCore

これでライブラリの導入が完了です。

モデルとバリデーションルールの実装

以下の例では、ユーザー情報を格納する User クラスと、それに対応するバリデーションルール UserValidator を作成しています。

using FluentValidation;

namespace Model
{
    public class User
    {
        public string Name { get; set; } = string.Empty;
        public int Age { get; set; }
    }

    public class UserValidator : AbstractValidator<User>
    {
        public UserValidator()
        {
            RuleFor(x => x.Name)
                .NotEmpty().WithMessage("名前は必須です")
                .Length(3, 50).WithMessage("名前は3文字以上50文字以下である必要があります");

            RuleFor(x => x.Age)
                .InclusiveBetween(18, 100).WithMessage("年齢は18歳以上100歳以下である必要があります");
        }
    }
}

RuleFor は各プロパティに対して検証ルールを定義するためのメソッドです。チェーン形式で記述でき、見やすさと保守性に優れています。

Minimal API との連携方法

FluentValidation は ASP.NET Core の Minimal API にも簡単に組み込めます。

using Model;
using FluentValidation;
using FluentValidation.AspNetCore;


var builder = WebApplication.CreateBuilder(args);
builder.Services.AddValidatorsFromAssemblyContaining<UserValidator>();

var app = builder.Build();

app.MapPost("/users", (User user, IValidator<User> validator) =>
{
    var validationResult = validator.Validate(user);

    if (!validationResult.IsValid)
    {
        return Results.BadRequest(validationResult.Errors.Select(e => e.ErrorMessage));
    }

    return Results.Ok(new { Message = "ユーザー登録成功", User = user });
});

app.Run();

IValidator インターフェースを使って、モデルに対する検証処理を API の中で実行しています。検証結果に応じて適切なレスポンスを返す設計です。

テストしてみました。正常時の結果はこんな感じです。

パラメータ

結果

バリデーションエラーの場合、こんな感じになります。

パラメータ

結果

なお、テストの具体的な方法はこちらの記事で解説しています。

【REST Client】VSCodeでHTTPリクエストをテストする方法(無料)
【REST Client】VSCodeでHTTPリクエストをテストする方法(無料)

カスタムルールの定義

FluentValidation では、標準的なルール以外にも、独自のルール(カスタムルール)を定義することが可能です。今回は下記の記述をUserクラスと同じ名前空間に追加してみます。

public class CustomUserValidator : AbstractValidator<User>
{
    public CustomUserValidator()
    {
        RuleFor(x => x.Name).Must(name => name.StartsWith("A"))
            .WithMessage("名前はAで始まる必要があります");
    }
}

この例では、「名前が ‘A’ で始まること」を検証するルールを定義しています。

実際にテストしてみます。

パラメータ

結果

まとめ

FluentValidation を活用することで、バリデーションの実装が以下のように効率的になります。

特徴説明
可読性が高いチェーン記法によりルールが明確に記述できる
拡張性があるカスタムルールや条件付きバリデーションも柔軟に対応可能
APIとの親和性が高いMinimal APIに簡単に統合できる

ユーザー入力の検証処理をしっかり実装したい方は、FluentValidationの導入をぜひ検討してみてください。

かなむ
かなむ

参考になればうれしいです。

ABOUT ME
かなむ
かなむ
現役SE。javaとc#とpythonとvbの経験あり。アプリ開発メイン。インフラ、特にネットワークは苦手。2児の父。好きな寿司ネタは「鯛」。将来は離島に別荘を構えたい。

記事URLをコピーしました