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

今回は C# で利用できる「FluentValidation(フルーエント・バリデーション)」という便利なライブラリについて解説します。たとえば「名前が空欄でないか」「年齢が18歳以上100歳以下であるか」といった、入力値の確認(バリデーション)を簡潔に記述できる仕組みです。
プログラミングでは、ユーザーから受け取る情報が正しいかを確認することが非常に重要です。FluentValidation を使うことで、こうしたチェックをシンプルかつ明確に記述できます。
なお、本記事で使用する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 の中で実行しています。検証結果に応じて適切なレスポンスを返す設計です。
テストしてみました。正常時の結果はこんな感じです。
パラメータ

結果

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

結果

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

カスタムルールの定義
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の導入をぜひ検討してみてください。

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