CodeShot

Validate() (همزمان) در مقابل ValidateAsync() (ناهمزمان)

Validate() تمام قوانین را به‌صورت همزمان و مسدودکننده اجرا می‌کند و برای قوانینی که فقط روی داده در حافظه کار می‌کنند (مثل طول رشته) مناسب است، در حالی که ValidateAsync() از قوانینی پشتیبانی می‌کند که نیاز به عملیات ناهمزمان دارند، مثل MustAsync() برای چک کردن یکتا بودن ایمیل در دیتابیس.

ویژگیValidate() (همزمان)ValidateAsync() (ناهمزمان)
پشتیبانی از MustAsyncخیربله
مسدودکننده بودنبلهخیر
مناسب برایقوانین ساده در حافظهقوانین وابسته به دیتابیس/API

کِی از Validate() (همزمان) استفاده کنیم؟

وقتی همه قوانین اعتبارسنجی صرفاً روی مقادیر موجود در همان شیء کار می‌کنند، بدون نیاز به دیتابیس یا سرویس خارجی.

کِی از ValidateAsync() (ناهمزمان) استفاده کنیم؟

وقتی حداقل یکی از قوانین نیاز به فراخوانی ناهمزمان دارد، مثل بررسی یکتا بودن یک فیلد در دیتابیس یا فراخوانی یک API خارجی.

مثال Validate() (همزمان)

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
        => RuleFor(u => u.Name).NotEmpty().MaximumLength(50);
}
var result = validator.Validate(user);

مثال ValidateAsync() (ناهمزمان)

RuleFor(u => u.Email).MustAsync(async (email, ct) =>
    !await _db.Users.AnyAsync(u => u.Email == email, ct))
    .WithMessage("این ایمیل قبلاً ثبت شده است");
var result = await validator.ValidateAsync(user);

اشتباه رایج

اشتباه رایج تعریف یک قانون MustAsync ولی فراخوانی آن با متد همزمان Validate() به‌جای ValidateAsync() است؛ این کار در بهترین حالت خطای Runtime می‌دهد یا در برخی نسخه‌ها قانون ناهمزمان را نادیده می‌گیرد.

جمع‌بندی

اگر حتی یک قانون ناهمزمان (مثل MustAsync) در اعتبارسنج دارید، همیشه باید از ValidateAsync() استفاده کنید؛ در غیر این صورت Validate() همزمان کافی و ساده‌تر است.