بهترین کتابخانهها برای اعتبارسنجی (Validation) در ASP.NET Core: یک راهنمای جامع
۱. اعتبارسنجی داخلی: DataAnnotations
سادهترین و در دسترسترین روش برای اعتبارسنجی در ASP.NET Core، استفاده از DataAnnotations است. این ویژگی که بخشی از خود فریمورک دات نت است، به شما اجازه میدهد تا با استفاده از Attributeها، قوانین اعتبارسنجی را مستقیماً روی خصوصیات مدلهای خود تعریف کنید.
ویژگیهای کلیدی:
-
سادگی و سرعت در پیادهسازی: استفاده از DataAnnotations بسیار آسان است و نیاز به نصب هیچ بسته خارجی ندارد.
-
خوانایی بالا در مدلها: قوانین اعتبارسنجی در کنار خصوصیتی که به آن اعمال میشوند قرار میگیرند که این امر درک مدل را سادهتر میکند.
-
پشتیبانی از اعتبارسنجی سمت کلاینت: بسیاری از این Attributeها به طور خودکار معادلهای جاوا اسکریپتی خود را برای اعتبارسنجی در مرورگر تولید میکنند.
محبوبترین Attributeها:
-
[Required]: مشخص میکند که یک فیلد نمیتواند خالی باشد.
-
[StringLength(max, MinimumLength=min)]: حداقل و حداکثر طول یک رشته را تعیین میکند.
-
[Range(min, max)]: محدوده مقادیر مجاز برای انواع عددی را مشخص میکند.
-
[RegularExpression("pattern")]: ورودی را با یک الگوی عبارات باقاعده (Regex) مطابقت میدهد.
-
[EmailAddress]: فرمت یک آدرس ایمیل را بررسی میکند.
-
[Compare("PropertyName")]: مقدار دو خصوصیت را با یکدیگر مقایسه میکند (معمولاً برای تأیید رمز عبور استفاده میشود).
public class RegisterViewModel
{
[Required(ErrorMessage = "نام کاربری الزامی است.")]
[StringLength(50, MinimumLength = 3, ErrorMessage = "نام کاربری باید بین ۳ تا ۵۰ کاراکتر باشد.")]
public string Username { get; set; }
[Required(ErrorMessage = "ایمیل الزامی است.")]
[EmailAddress(ErrorMessage = "فرمت ایمیل نامعتبر است.")]
public string Email { get; set; }
[Required(ErrorMessage = "رمز عبور الزامی است.")]
[DataType(DataType.Password)]
public string Password { get; set; }
[DataType(DataType.Password)]
[Compare("Password", ErrorMessage = "رمزهای عبور با یکدیگر مطابقت ندارند.")]
public string ConfirmPassword { get; set; }
}
چه زمانی از DataAnnotations استفاده کنیم؟
DataAnnotations برای پروژههای کوچک تا متوسط و سناریوهایی با قوانین اعتبارسنجی ساده و سرراست، گزینهای عالی است. اگر به دنبال راهاندازی سریع و بدون دردسر هستید، این روش بهترین انتخاب شما خواهد بود.
محدودیتها:
با پیچیدهتر شدن قوانین کسبوکار، استفاده از DataAnnotations میتواند منجر به شلوغی مدلها و نقض اصل Single Responsibility Principle (SRP) شود. همچنین، پیادهسازی قوانین شرطی و پیچیده که به چندین فیلد وابسته هستند، با این روش دشوار و گاهی غیرممکن است.
۲. قدرت و انعطافپذیری با FluentValidation
FluentValidation محبوبترین کتابخانه شخص ثالث برای اعتبارسنجی در اکوسیستم دات نت است. این کتابخانه با ارائه یک API روان (Fluent) و خوانا، به شما اجازه میدهد تا منطق اعتبارسنجی را به طور کامل از مدلهای خود جدا کرده و در کلاسهای Validator مجزا تعریف کنید.
ویژگیهای کلیدی:
-
جداسازی کامل منطق اعتبارسنجی: این ویژگی منجر به کد تمیزتر، خواناتر و با قابلیت نگهداری بالاتر میشود.
-
API روان و قدرتمند: تعریف قوانین، حتی قوانین پیچیده و شرطی، بسیار ساده و شبیه به زبان انگلیسی است.
-
قابلیت تستپذیری بالا: از آنجایی که Validatorها کلاسهای مستقلی هستند، به راحتی میتوان برای آنها Unit Test نوشت.
-
پشتیبانی از قوانین پیچیده و شرطی: به سادگی میتوانید قوانینی تعریف کنید که اجرای آنها به مقدار یک فیلد دیگر بستگی داشته باشد.
-
پشتیبانی از اعتبارسنجی ناهمزمان (Asynchronous): میتوانید قوانینی تعریف کنید که برای اعتبارسنجی نیاز به فراخوانیهای پایگاه داده یا سرویسهای خارجی دارند.
-
تزریق وابستگی (Dependency Injection): به راحتی میتوانید سرویسهای مورد نیاز خود را به Validatorها تزریق کنید.
نصب و راهاندازی:
برای شروع، بسته NuGet مربوطه را نصب کنید:
dotnet add package FluentValidation.AspNetCore
سپس آن را در Program.cs (یا Startup.cs) ثبت کنید:
builder.Services.AddControllersWithViews()
.AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<Program>());
مثال:
ابتدا مدل خود را بدون هیچ Attribute ای تعریف میکنیم:
public class RegisterViewModel
{
public string Username { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string ConfirmPassword { get; set; }
}
سپس، یک کلاس Validator برای آن ایجاد میکنیم:
public class RegisterViewModelValidator : AbstractValidator<RegisterViewModel>
{
public RegisterViewModelValidator()
{
RuleFor(x => x.Username)
.NotEmpty().WithMessage("نام کاربری الزامی است.")
.Length(3, 50).WithMessage("نام کاربری باید بین ۳ تا ۵۰ کاراکتر باشد.");
RuleFor(x => x.Email)
.NotEmpty().WithMessage("ایمیل الزامی است.")
.EmailAddress().WithMessage("فرمت ایمیل نامعتبر است.");
RuleFor(x => x.Password)
.NotEmpty().WithMessage("رمز عبور الزامی است.")
.MinimumLength(8).WithMessage("رمز عبور باید حداقل ۸ کاراکتر باشد.");
RuleFor(x => x.ConfirmPassword)
.Equal(x => x.Password).WithMessage("رمزهای عبور با یکدیگر مطابقت ندارند.");
}
}
چه زمانی از FluentValidation استفاده کنیم؟
FluentValidation برای پروژههای بزرگ، برنامههایی با منطق کسبوکار پیچیده و سناریوهایی که نیاز به تستپذیری بالا دارند، انتخاب ایدهآل است. اگر به دنبال کدی تمیز، ساختاریافته و با قابلیت نگهداری بالا هستید، این کتابخانه بهترین گزینه برای شماست.
۳. اعتبارسنجی شرطی با FoolProof.Core
گاهی اوقات نیاز به قوانینی داریم که اجرای آنها کاملاً به مقدار یک فیلد دیگر وابسته است. برای مثال، یک فیلد تنها در صورتی الزامی باشد که یک چکباکس خاص تیک خورده باشد. در حالی که پیادهسازی چنین سناریوهایی با FluentValidation امکانپذیر است، کتابخانه FoolProof.Core این کار را با استفاده از Attributeها و به شیوهای مشابه DataAnnotations بسیار ساده میکند.
این کتابخانه در واقع مجموعهای از Attributeهای اعتبارسنجی شرطی را به DataAnnotations اضافه میکند.
ویژگیهای کلیدی:
-
سادگی در پیادهسازی اعتبارسنجی شرطی: ارائه Attributeهایی مانند [RequiredIf]، [GreaterThan] و ...
-
حفظ رویکرد مبتنی بر Attribute: برای کسانی که با DataAnnotations راحتتر هستند، این کتابخانه یک افزونه قدرتمند محسوب میشود.
-
پشتیبانی از اعتبارسنجی سمت کلاینت: این کتابخانه اسکریپتهای لازم برای اجرای این قوانین شرطی در سمت کاربر را نیز فراهم میکند.
محبوبترین Attributeها:
-
[RequiredIf("PropertyName", Operator.EqualTo, "Value")]: فیلد را در صورتی الزامی میکند که خصوصیت دیگر مقدار مشخصی داشته باشد.
-
[GreaterThan("PropertyName")]: مقدار فیلد باید از مقدار خصوصیت دیگری بزرگتر باشد.
-
[Is("PropertyName")]: و چندین Attribute مقایسهای دیگر.
مثال:
public class UserProfileViewModel
{
public bool HasShippingAddress { get; set; }
[RequiredIf(nameof(HasShippingAddress), Operator.EqualTo, true, ErrorMessage = "آدرس پستی الزامی است.")]
public string ShippingAddress { get; set; }
[Required]
public int Age { get; set; }
[GreaterThan(nameof(Age), ErrorMessage = "سن بازنشستگی باید از سن فعلی بیشتر باشد.")]
public int RetirementAge { get; set; }
}
چه زمانی از FoolProof.Core استفاده کنیم؟
اگر پروژه شما عمدتاً از DataAnnotations استفاده میکند اما در موارد خاصی نیاز به اعتبارسنجی شرطی دارید و نمیخواهید به طور کامل به FluentValidation مهاجرت کنید، FoolProof.Core یک راهحل عالی و کمدردسر است.
۴. نگاهی به آینده: Validot
Validot یک کتابخانه جدیدتر است که با تمرکز ویژه بر کارایی (Performance) طراحی شده است. این کتابخانه نیز مانند FluentValidation از یک API روان برای تعریف قوانین استفاده میکند اما ادعا میکند که در سناریوهای پیچیده، بهینهسازیهای بیشتری را برای کاهش سربار اعتبارسنجی انجام میدهد.
ویژگیهای کلیدی:
-
کارایی بالا: طراحی شده برای حداقل سربار ممکن.
-
API روان و فشرده: سینتکس کمی متفاوت اما قدرتمند.
-
عدم وجود وابستگیهای خارجی: یک کتابخانه سبک و مستقل است.
مثال (بر اساس مستندات Validot):
Specification<UserModel> specification = _ => _
.Member(m => m.Email, m => m.Email().MaxLength(100))
.Member(m => m.Name, m => m.Optional().LengthBetween(8, 100))
.Rule(m => m.Age >= 18 || m.Name != null);
var validator = Validator.Factory.Create(specification);
چه زمانی از Validot استفاده کنیم؟
اگر در پروژهای کار میکنید که کارایی در آن از اهمیت فوقالعاده بالایی برخوردار است (مانند سیستمهای با توان عملیاتی بالا) و منطق اعتبارسنجی شما بسیار پیچیده است، Validot میتواند گزینهای قابل بررسی باشد.
مقایسه و نتیجهگیری نهایی
| ویژگی | DataAnnotations | FluentValidation | FoolProof.Core | Validot |
| سهولت استفاده | بسیار آسان | متوسط | آسان | متوسط |
| جداسازی منطق | خیر (درون مدل) | بله (کلاس مجزا) | خیر (درون مدل) | بله (کلاس مجزا) |
| قوانین پیچیده/شرطی | ضعیف | بسیار قوی | قوی (برای سناریوهای خاص) | قوی |
| تستپذیری | ضعیف | بسیار قوی | ضعیف | بسیار قوی |
| ناهمزمانی (Async) | خیر | بله | خیر | خیر |
| کارایی (Performance) | خوب | بسیار خوب | خوب | عالی |
| وابستگی خارجی | خیر | بله | بله | بله |
انتخاب نهایی به نیازهای پروژه شما بستگی دارد:
-
برای شروع سریع و پروژههای ساده: از DataAnnotations استفاده کنید. این روش داخلی، سریع و کارآمد است.
-
برای پروژههای حرفهای، بزرگ و پیچیده: بدون شک FluentValidation بهترین انتخاب است. جداسازی منطق، تستپذیری و قدرت بالای آن در بلندمدت ارزش سرمایهگذاری را دارد.
-
برای افزودن قوانین شرطی به پروژه مبتنی بر DataAnnotations: از FoolProof.Core به عنوان یک راهحل مکمل و سریع استفاده کنید.
-
برای سناریوهای بسیار حساس به کارایی: Validot را به عنوان یک جایگزین مدرن و بهینه در نظر بگیرید.
در نهایت، درک صحیح از پیچیدگی و نیازمندیهای پروژه، کلید انتخاب بهترین ابزار برای اعتبارسنجی در برنامههای ASP.NET Core شماست.
0 نظر
هنوز نظری برای این مقاله ثبت نشده است.