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() همزمان کافی و سادهتر است.
