عنوان:

‫امکان اعتبارسنجی در سطح نوع در NET 10 RC1.


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۶/۱۹ ۱۰:۳۴
آدرس: www.dntips.ir
در اکوسیستم توسعه نرم‌افزار دات‌نت (.NET)، اعتبارسنجی (Validation) داده‌ها یکی از مراحل حیاتی برای تضمین صحت و امنیت اطلاعات است. با معرفی .NET 10، بهبودهای قابل توجهی در این فرآیند به‌ویژه برای Minimal APIs و فریم‌ورک Blazor اعمال شده است که فرآیند اعتبارسنجی را قدرتمندتر، منعطف‌تر و سازگارتر کرده است. این مقاله به بررسی عمیق این بهبودها می‌پردازد و نشان می‌دهد که چگونه توسعه‌دهندگان می‌توانند از ویژگی‌های جدید برای ساخت برنامه‌های کاربردی مستحکم‌تر بهره ببرند.

اعتبارسنجی در سطح نوع: قواعدی برای کل شیء

در گذشته، اعتبارسنجی عمدتاً با استفاده از ویژگی‌های (Attributes) اعتبارسنجی مانند [Required] یا [Range] بر روی خصوصیات (Properties) کلاس‌ها انجام می‌شد. اما همواره نیاز به اعتبارسنجی‌های پیچیده‌تری وجود داشت که به منطق کلی یک شیء مربوط می‌شد، نه یک خصوصیت منفرد. برای مثال، فرض کنید می‌خواهید مطمئن شوید که مجموع دو عدد در یک شیء، از یک مقدار خاص تجاوز نمی‌کند.
در NET 10 RC1.، این محدودیت برداشته شده است. اکنون می‌توانید ویژگی‌های اعتبارسنجی را مستقیماً بر روی خود کلاس‌ها یا رکوردها (Records) اعمال کنید. این قابلیت به شما امکان می‌دهد تا منطق‌های اعتبارسنجی سفارشی را به سادگی در سطح نوع (Type-level) پیاده‌سازی کنید و کد را خواناتر و قابل نگهداری‌تر نمایید.

مثال عملی:
برای پیاده‌سازی این قابلیت، کافی است یک کلاس ویژگی اعتبارسنجی سفارشی ایجاد کنید که از کلاس پایه ValidationAttribute ارث‌بری می‌کند. سپس، با بازنویسی (Override) متد IsValid، منطق اعتبارسنجی خود را پیاده‌سازی کنید.
[SumLimit(42)]
record Point(int X, int Y);

class SumLimitAttribute(int Limit) : ValidationAttribute
{
    protected override ValidationResult? IsValid(object? value, ValidationContext _)
    {
        if (value is Point point && point.X + point.Y > Limit)
        {
            return new ValidationResult("The sum of X and Y is too high");
        }
        return ValidationResult.Success;
    }
}
در این مثال، ویژگی [SumLimit(42)] بر روی رکورد Point اعمال شده است. متد IsValid بررسی می‌کند که آیا مجموع خصوصیات X و Y از مقدار تعیین شده (42) بیشتر است یا خیر. این رویکرد به شما اجازه می‌دهد تا اعتبارسنجی‌های مربوط به چندین خصوصیت را در یک مکان متمرکز کنید، که در نهایت به کدی تمیزتر منجر می‌شود.

نادیده گرفتن اعتبارسنجی با [SkipValidation]

گاهی اوقات، یک مدل داده (Data Model) در سناریوهای مختلفی مورد استفاده قرار می‌گیرد. ممکن است در یک سناریو نیاز به اعتبارسنجی کامل یک شیء باشد، اما در سناریوی دیگر، بخواهید اعتبارسنجی یک یا چند خصوصیت یا حتی کل شیء را نادیده بگیرید. ویژگی جدید [SkipValidation] دقیقاً برای همین منظور طراحی شده است.
با استفاده از این ویژگی، می‌توانید به راحتی اعتبارسنجی را برای موارد زیر غیرفعال کنید:
  • خصوصیت یا پارامتر خاص: با اعمال [SkipValidation] بر روی یک خصوصیت یا پارامتر، اعتبارسنجی آن نادیده گرفته می‌شود.
  • کل یک نوع (Type): با اعمال [SkipValidation] بر روی یک کلاس، تمام خصوصیات و پارامترهای آن از فرآیند اعتبارسنجی حذف می‌شوند.

مثال از کاربرد:
مدل Order را در نظر بگیرید که شامل دو آدرس است: یکی برای پرداخت (PaymentAddress) و دیگری برای تماس (ContactAddress).
class Order
{
    public Address PaymentAddress { get; set; }

    [SkipValidation]
    public Address ContactAddress { get; set; }
}

class Address
{
    [Required]
    public string Street { get; set; }

    // ...
}
در این مثال، خصوصیت ContactAddress با [SkipValidation] مشخص شده است. در نتیجه، اعتبارسنجی [Required] که بر روی خصوصیت Street در کلاس Address اعمال شده، برای ContactAddress اجرا نخواهد شد، در حالی که برای PaymentAddress به درستی کار می‌کند. این ویژگی به ویژه زمانی که از یک مدل مشترک در چندین نقطه از برنامه استفاده می‌کنید، بسیار مفید است.
همچنین، برای افزایش سازگاری بین اعتبارسنجی و سریال‌سازی JSON، خصوصیات دارای ویژگی [JsonIgnore] نیز به طور خودکار از اعتبارسنجی حذف می‌شوند. با این حال، استفاده از [SkipValidation] برای مدیریت صریح این رفتار توصیه می‌شود.

سازگاری و رفتار بهینه‌سازی‌شده

یکی از مهم‌ترین بهبودهای صورت گرفته در .NET 10، یکسان‌سازی رفتار اعتبارسنجی با کلاس System.ComponentModel.DataAnnotations.Validator است. این یکپارچگی به توسعه‌دهندگان اطمینان می‌دهد که منطق اعتبارسنجی در Minimal APIs و Blazor به همان شیوه‌ای که در سایر بخش‌های اکوسیستم دات‌نت عمل می‌کند، رفتار خواهد کرد.
فرآیند اعتبارسنجی اکنون به ترتیب زیر اجرا می‌شود:
  • اعتبارسنجی خصوصیات عضو (Member Properties): اعتبارسنجی ویژگی‌های اعمال‌شده بر روی خصوصیات کلاس اجرا می‌شود، شامل اعتبارسنجی بازگشتی (Recursively) برای اشیاء تودرتو (Nested Objects).
  • اعتبارسنجی در سطح نوع (Type-level): ویژگی‌های اعتبارسنجی که مستقیماً بر روی کلاس اعمال شده‌اند، اعتبارسنجی می‌شوند.
  • اجرای IValidatableObject.Validate: در نهایت، اگر کلاس مورد اعتبارسنجی این رابط (Interface) را پیاده‌سازی کرده باشد، متد Validate آن فراخوانی می‌شود.

یک نکته کلیدی در این فرآیند، رفتار «مدار کوتاه» (Short-circuiting) است. اگر هر یک از این مراحل یک خطای اعتبارسنجی تولید کند، مراحل بعدی نادیده گرفته می‌شوند. این بهینه‌سازی عملکرد را بهبود می‌بخشد و از اجرای منطق‌های غیرضروری جلوگیری می‌کند.


نتیجه‌گیری

بهبودهای اعتبارسنجی در .NET 10 RC1، به ویژه معرفی ویژگی‌های اعتبارسنجی در سطح نوع و [SkipValidation]، انعطاف‌پذیری و قدرت بیشتری را برای توسعه‌دهندگان فراهم می‌کند. این ویژگی‌ها نه تنها به ساده‌سازی منطق‌های پیچیده اعتبارسنجی کمک می‌کنند، بلکه با یکپارچه‌سازی رفتار با System.ComponentModel.DataAnnotations.Validator، یک تجربه توسعه سازگار و قابل پیش‌بینی را در سراسر پلتفرم .NET ارائه می‌دهند. استفاده از این ابزارهای جدید به شما امکان می‌دهد تا برنامه‌های کاربردی ایمن‌تر و مستحکم‌تری بسازید که از لحاظ داده‌ای قابل اعتماد هستند.


مشاهده مطلب اصلی