FluentValidation چیست؟
کتابخانهای برای نوشتن قوانین اعتبارسنجی (Validation) با یک Fluent API خوانا، کاملاً جدا از خود مدل یا DTO.
چرا مهم است؟
با جدا نگهداشتن قوانین Validation از مدل، یک مدل میتواند در سناریوهای مختلف (مثلاً ثبت در برابر ویرایش) قوانین متفاوتی داشته باشد، بدون شلوغشدن خود کلاس مدل با Attributeهای پراکنده.
تعریف یک Validator
public class CreateOrderValidator : AbstractValidator<CreateOrderCommand>
{
public CreateOrderValidator()
{
RuleFor(x => x.CustomerId).NotEmpty();
RuleFor(x => x.Amount).GreaterThan(0)
.WithMessage("مبلغ باید بزرگتر از صفر باشد.");
}
}
ادغام با ASP.NET Core / MediatR
builder.Services.AddValidatorsFromAssembly(typeof(CreateOrderValidator).Assembly);
// معمولاً بهعنوان یک Pipeline Behavior در MediatR اجرا میشود، قبل از رسیدن به Handler
تفاوت با Data Annotations
Data Annotations (مثل [Required]) قوانین را مستقیم روی خود کلاس مدل میگذارد؛ FluentValidation قوانین را در یک کلاس کاملاً جدا نگه میدارد که تستنویسی مستقل از آن و تعریف چند Validator متفاوت برای یک مدل را ساده میکند.
اشتباه رایج
❌ قرار دادن منطق کسبوکار پیچیده (مثلاً بررسی موجودی انبار با پرسوجو از دیتابیس) داخل Validator — Validator باید فقط شکل و صحت ورودی را بررسی کند؛ قوانین کسبوکار واقعی جایشان داخل Domain/Handler است، نه لایه Validation.
خلاصه
FluentValidation قوانین اعتبارسنجی را با یک Fluent API خوانا و کاملاً جدا از کلاس مدل تعریف میکند، برخلاف Data Annotations که روی خود مدل قرار میگیرند. معمولاً بهعنوان Pipeline Behavior قبل از رسیدن Request به Handler اجرا میشود. منطق کسبوکار پیچیده نباید داخل Validator نوشته شود.
