عنوان:

‫پایان یک انتظار طولانی: اعتبارسنجی ناهمگام (Async Validation) در NET 11.


نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۴/۱۴ ۰۸:۴۵
آدرس: www.dntips.ir
در طول سال‌های گذشته، سیستم اعتبارسنجی مدل (Model Validation) توکار در اکوسیستم دات‌نت که عمدتاً بر پایه‌ی فضای نام System.ComponentModel.DataAnnotations استوار است، ساختاری کاملاً همگام (Synchronous) داشت. این طراحی سنتی، پیاده‌سازی قواعد اعتبارسنجی پیچیده‌ای را که به عملیات‌های ورودی/خروجی (I/O-bound) وابسته بودند با چالش مواجه می‌کرد؛ سناریوهایی مانند بررسی منحصربه‌فرد بودن نام کاربری در پایگاه داده، استعلام وضعیت یک شناسه از طریق Web API خارجی یا سنجش موجودی انبار.
توسعه‌دهندگان برای پیاده‌سازی این زیرساخت‌ها ناچار بودند یا به ابزارهای شخص ثالث مانند کتابخانه محبوب FluentValidation روی آورند، یا متدهای ناهمگام را به صورت ناامن و مسدودکننده (Thread Blocking) با استفاده از امضا‌هایی مانند .Result یا .Wait() فراخوانی کنند. این رویکرد نامناسب، مستقیماً ریسک بروز گلوگاه در پایگاه ریسمان‌ها (Thread Pool Starvation) را افزایش می‌داد. در پی درخواست‌های مکرر جامعه توسعه‌دهندگان، مایکروسافت بالاخره در .NET 11 Preview 6 زیرساخت اعتبارسنجی ناهمگام را به صورت بومی به هسته فریم‌ورک اضافه کرد تا به یکی از پررای‌ترین درخواست‌های گیت‌هاب (Issue #31905) پاسخ دهد.

معماری و قابلیت‌های جدید در .NET 11
این تغییرات زیرساختی، معماری اعتبارسنجی دات‌نت را متحول کرده است. در این مکانیزم جدید، سه افزونه اساسی به فضای نام System.ComponentModel.DataAnnotations اضافه شده است که به توسعه‌دهندگان اجازه می‌دهد منطق ناهمگام خود را بدون مسدود کردن ریسمان‌ها پیاده‌سازی کنند:
  • کلاس انتزاعی AsyncValidationAttribute: این کلاس پایه جدید، جایگزین مستقیم ValidationAttribute برای سناریوهای ناهمگام است و امکان نوشتن اتریبیوت‌های سفارشی را با بازنویسی (Override) متد IsValidAsync فراهم می‌کند.
  • اینترفیس IAsyncValidatableObject: همتای ناهمگام اینترفیس شناخته‌شده‌ی IValidatableObject که به خودِ مدل یا DTO اجازه می‌دهد منطق اعتبارسنجی درونی‌اش را به صورت اسنک (Async) پیاده‌سازی کند.
  • متدهای نوین در کلاس static اعتبارسنجی (Validator): معرفی متدهای جدید از جمله ValidateObjectAsync، TryValidateObjectAsync، ValidatePropertyAsync و ValidateValueAsync جهت اجرای غیرمسدودکننده عملیات سنجش صحت داده‌ها.

پیاده‌سازی عملی اتریبیوت اعتبارسنجی ناهمگام
در نمونه کد زیر، شیوه تعریف یک قانون اعتبارسنجی ناهمگام جهت بررسی منحصربه‌فرد بودن نام کاربری به ساده‌ترین شکل ممکن ارائه شده است. متد سنتی IsValid به صورت پیش‌فرض برای سازگاری عقب‌رو (Backward Compatibility) مقدار ValidationResult.Success را برمی‌گرداند و منطق اصلی در IsValidAsync به همراه پشتیبانی از CancellationToken پیاده‌سازی می‌شود.
using System.ComponentModel.DataAnnotations;
using Microsoft.Extensions.DependencyInjection;

public sealed class UniqueUserNameAttribute : AsyncValidationAttribute
{
    // سازگاری با خط لوله‌های همگام قدیمی
    protected override ValidationResult? IsValid(object? value, ValidationContext context)
        => ValidationResult.Success;

    // پیاده‌سازی اصلی برای خط لوله ناهمگام دات‌نت ۱۱
    protected override async Task<ValidationResult?> IsValidAsync(
        object? value, ValidationContext context, CancellationToken cancellationToken)
    {
        // دریافت مستقیم سرویس‌ها از کانتینر DI با استفاده از Context موجود
        var users = context.GetRequiredService<IUserStore>();
        
        bool isTaken = await users.ExistsAsync((string?)value, cancellationToken);
        
        return isTaken
            ? new ValidationResult("این نام کاربری قبلاً توسط کاربر دیگری انتخاب شده است.")
            : ValidationResult.Success;
    }
}

public class RegistrationRequest
{
    [Required]
    [UniqueUserName]
    public string UserName { get; set; } = "";
}
جهت فراخوانی و اعتبارسنجی ناهمگام این مدل در خط لوله‌های دستی یا خارج از لایه کنترلر، موتور Validator متدهای الحاقی جدید خود را ارائه می‌دهد:
// اجرای فرآیند اعتبارسنجی ناهمگام بدون بلاک کردن Thread
var context = new ValidationContext(model, serviceProvider, items: null);
await Validator.ValidateObjectAsync(model, context, validateAllProperties: true);
نکته: یکی از نکات کلیدی هنگام استفاده از ValidationContext.GetRequiredService در محیط‌های ناهمگام، طول عمر (Lifetime) سرویس تزریق‌شده است. اگر سرویس شما دارای طول عمر محدوده (Scoped) باشد (مانند DbContext در Entity Framework Core)، اطمینان حاصل کنید که نمونه کانتینیشن جاری در محدوده لایف‌تایم درخواست وب (HTTP Request Scope) اجرا می‌شود تا با خطای دسترسی همزمان (Concurrency) مواجه نشوید.

توسعه به زیرسیستم Configuration و اعتبارسنجی زمان راه‌اندازی (Startup)
تغییرات شگرف دات‌نت ۱۱ محدود به لایه‌ی مدل‌های ورودی (API Models) نیست؛ مایکروسافت این رویکرد را به سیستم مدیریت تنظیمات برنامه یعنی Microsoft.Extensions.Options نیز گسترش داده است.
از طریق اینترفیس جدید IAsyncStartupValidator، اپلیکیشن‌ها می‌توانند کدهای مربوط به تنظیمات وب و سرویس‌های ابری خود را که نیازمند اعتبارسنجی شبکه‌ای هستند (مانند بررسی صحت خط اتصال پایگاه داده، صحت کلیدهای API متصل به درگاه‌های مالی، یا در دسترس بودن سرور کش رادیس) در زمان بوت شدن برنامه به صورت ناهمگام بررسی کنند.
این مکانیزم پیاده‌سازی الگوی طراحی Fail-Fast را در بهینه‌ترین حالت ممکن میسر می‌سازد. اگر پیکربندی‌های حیاتی سیستم نادرست باشد، سرویس پیش از پردازش هرگونه درخواست ورودی و بدون معطل نگه داشتن ترد، با خطا متوقف (Crash) می‌شود تا از رفتارهای پیش‌بینی‌نشده در زمان اجرا جلوگیری شود.

نتیجه‌گیری
یکپارچه‌سازی سیستم ناهمگام با DataAnnotations در .NET 11 یکی از بنیادین‌ترین اصلاحات ساختاری در زیرسیستم اعتبارسنجی در چند سال گذشته است. این قابلیت با آزادسازی پتانسیل مسدودکننده کدهای قدیمی، مقیاس‌پذیری (Scalability) و نرخ پاسخ‌دهی سرور تحت بارهای ترافیکی شدید را به شکل چشمگیری ارتقا می‌دهد. با کاهش وابستگی به کتابخانه‌های فرعی و افزایش انعطاف‌پذیری Options Pattern در زمان استارت‌آپ، توسعه‌دهندگان دات‌نت اکنون ابزاری بومی، قدرتمند و فوق‌العاده بهینه برای مدیریت صحت داده‌ها در اختیار دارند.

نظرات

  • وحید نصیری در ۱۴۰۵/۰۴/۲۷ ۰۸:۵۵
    ضمیمه تکمیلی: اعتبارسنجی ناهمگام در لایه Minimal APIs دات‌نت ۱۱

    در ادامه کالبدشکافی قابلیت‌های جدید NET 11.، تمرکز این مطلب بر روی تحولات عمیق لایه وب پلتفرم یعنی Minimal APIs و هماهنگی کامل آن با خط لوله اعتبارسنجی ناهمگام (End-to-End Async Validation) است که بر پایه ویژگی‌های افزوده شده در قالب تغییرات هسته فریم‌ورک (dotnet/aspnetcore #66487 و #67183) توسعه یافته است.

    ۱. فعال‌سازی و اکوسیستم Minimal APIs در .NET 11
    در نسخه‌های قبلی دات‌نت، اعتبارسنجی مدل در Minimal APIs به روانی لایه‌ی کلاسیک MVC/Controllers نبود. اما در نسخه ۱۱، به لطف معرفی پکیج و سرویس توکار اعتبارسنجی، فعال‌سازی این خط لوله با فراخوانی متد ساده‌ی AddValidation امکان‌پذیر شده است. فریم‌ورک از طریق Microsoft.Extensions.Validation به طور خودکار قبل از اجرای هر اِندپوینت، مدل‌های ورودی را سنجش کرده و در صورت بروز خطا، پاسخ 400 Bad Request برمی‌گرداند.
    var builder = WebApplication.CreateBuilder(args);
    
    // اضافه کردن سرویس‌های اعتبارسنجی توکار به کانتینر DI
    builder.Services.AddValidation();
    builder.Services.AddScoped<ICatalogService, CatalogService>();
    
    var app = builder.Build();
    
    // فریم‌ورک به طور خودکار قبل از اجرای اِندپوینت، ساختار ورودی را ناهمگام می‌سنجد
    app.MapPost("/products", (Product product) => Results.Ok(product));
    
    app.Run();

    ۲. استراتژی پرتاب استثنا (Throwing) در متدهای همگام؛ چرا و چگونه؟
    یکی از نکات بسیار کلیدی در زمان استفاده از AsyncValidationAttribute و IAsyncValidatableObject در بستر Minimal APIs، نحوه برخورد با متدهای همگامِ قدیمی (IsValid و Validate) است. از آنجایی که فریم‌ورک همواره مسیر ناهمگام (Async Path) را فراخوانی می‌کند، در متدهای سنتی همگام با قاطعیت اقدام به پرتاب InvalidOperationException می‌کنیم.
    دلیل این کار چیست؟
    اگر از متد همگام به سادگی عبور کنیم یا مقدار موفقیت برگردانیم، چنانچه مدل شما در مکانی خارج از خط لوله ناهمگام جدید (مثلاً در یک خط لوله همگام قدیمی) فراخوانی شود، فرآیند اعتبارسنجی بدون انجام هیچ آزمایشی به طور صامت (Silently) رد می‌شود. پرتاب خطا تضمین می‌کند که این اتریبیوت یا مدل فقط و فقط در ساختارهای سازگار با قابلیت ناهمگام دات‌نت ۱۱ اجرا خواهد شد.

    نمونه کد پیاده‌سازی اتریبیوت سفارشی در Minimal APIs:
    internal sealed class UniqueSkuAttribute : AsyncValidationAttribute
    {
        // متد همگام عمداً خطا پرتاب می‌کند تا از دور زدن صامت اعتبارسنجی جلوگیری شود
        protected override ValidationResult? IsValid(object? value, ValidationContext validationContext) =>
            throw new InvalidOperationException($"اعتبارسنجی این اتریبیوت باید با متد '{nameof(IsValidAsync)}' انجام شود.");
    
        protected override async Task<ValidationResult?> IsValidAsync(
            object? value, ValidationContext validationContext, CancellationToken cancellationToken)
        {
            var catalogService = validationContext.GetRequiredService<ICatalogService>();
            
            if (value is string sku && await catalogService.SkuExistsAsync(sku, cancellationToken))
            {
                return new ValidationResult("محصولی با این شناسه کالا (SKU) از قبل وجود دارد.");
            }
    
            return ValidationResult.Success;
        }
    }

    ۳. اعتبارسنجی چند-ویژگی به صورت مالتی‌تسک با IAsyncValidatableObject
    زمانی که اعتبارسنجی شما وابسته به چندین پروپرتی مختلف در مدل باشد (مانند چک کردن همزمان شناسه کالا و تعداد درخواستی در سبد خرید با موجودی زنده انبار)، باید به سراغ اینترفیس IAsyncValidatableObject بروید. این اینترفیس با بازگرداندن IAsyncEnumerable امکان تولید جریان پویایی از خطاها را با استفاده از کلمه‌کلیدی yield return مهیا می‌کند.
    using System.ComponentModel.DataAnnotations;
    using System.Runtime.CompilerServices;
    
    public record OrderRequest(
        [Range(1, int.MaxValue)] int ProductId,
        [Range(1, int.MaxValue)] int Quantity,
        string PromoCode) : IAsyncValidatableObject
    {
        // پیاده‌سازی متد همگام و پرتاب استثنا برای امنیت بیشتر
        public IEnumerable<ValidationResult> Validate(ValidationContext context) =>
            throw new InvalidOperationException($"این نوع داده باید با متد '{nameof(ValidateAsync)}' سنجیده شود.");
    
        // پیاده‌سازی جریان ناهمگام خطاها
        public async IAsyncEnumerable<ValidationResult> ValidateAsync(
            ValidationContext context,
            [EnumeratorCancellation] CancellationToken cancellationToken = default)
        {
            var catalogService = context.GetRequiredService<ICatalogService>();
    
            // بررسی موجودی انبار به صورت ناهمگام
            if (!await catalogService.HasStockAsync(ProductId, Quantity, cancellationToken))
            {
                yield return new ValidationResult(
                    $"محصول شناسه '{ProductId}' به تعداد '{Quantity}' واحد در انبار موجود نیست.",
                    [nameof(Quantity)]);
            }
    
            // بررسی کد تخفیف به صورت ناهمگام
            if (!await catalogService.IsPromoCodeValidAsync(PromoCode, cancellationToken))
            {
                yield return new ValidationResult(
                    $"کد تخفیف '{PromoCode}' معتبر نیست.",
                    [nameof(PromoCode)]);
            }
        }
    }

    ۴. هم‌روندی و موازنه کارهای ناهمگام (Concurrency Execution)
    یکی از هیجان‌انگیزترین بخش‌های این بروزرسانی، نحوه زمان‌بندی و اجرای اعتبارسنجی‌ها توسط فریم‌ورک است. مایکروسافت موتور اعتبارسنجی را به گونه‌ای بهینه‌سازی کرده است که قواعد را تا حد امکان به صورت همزمان و موازی (Concurrently) اجرا کند:
    • اتریبیوت‌های ناهمگام بر روی یک عضو (Member): اگر روی یک ویژگی (Property) چند اتریبیوت ناهمگام تعریف شده باشد، فرآیند اجرای متدهای IsValidAsync آن‌ها همزمان آغاز می‌شود تا زمان انتظار کاهش یابد.
    • اعتبارسنجی مجموعه‌ها (Collections): آیتم‌های موجود در داخل لیست‌ها و کالکشن‌ها به شکل موازی (Parallel) وارد خط لوله سنجش می‌شوند.
    • حفظ اولویت سنتی: در عین اجرای همزمان و موازی، فریم‌ورک کماکان مرزها و ترتیب‌های منطقی را حفظ می‌کند؛ به این معنا که ابتدا اعتبارسنجی‌های مربوط به اعضا (Properties)، سپس کلاس (Type-Level) و در نهایت نمونه‌های IAsyncValidatableObject مورد ارزیابی قرار می‌گیرند تا ساختار اولویت‌بندی از بین نروید.

    نتیجه‌گیری بخش تکمیلی
    پشتیبانی همه‌جانبه (End-to-End) از اعتبارسنجی ناهمگام در Minimal APIs در دات‌نت ۱۱، خلاء بزرگ کارایی در این لایه سبک‌وزن را پر کرده است. با ترکیب موازی‌سازی هوشمند در پردازش قوانین و امکان استفاده راحت از کانتینر DI در محیط ویژگی‌ها، توسعه‌دهندگان می‌توانند سرویس‌هایی به شدت مقیاس‌پذیر و ایمن بدون دغدغه بابت مسدود شدن ریسمان‌ها (Thread Blocking) بنا کنند.
  • وحید نصیری در ۱۴۰۵/۰۶/۲۵ ۰۸:۴۵
    اعتبارسنجی ناهمگام پیکربندی‌ها (Async Options Validation) در دات‌نت: معماری، چرخه حیات و مهاجرت

    ۱. مقدمه و بیان مسئله
    در طراحی سیستم‌های توزیع‌شده و میکروسرویس‌ها، رعایت اصل Fail-Fast اهمیت حیاتی دارد؛ به این معنی که اگر سرویسی به دلیل اشتباه در تنظیمات پیکربندی (مانند آدرس نامعتبر دیتابیس یا هاست ناموجود) قادر به سرویس‌دهی نیست، باید در همان لحظه شروع متوقف شود و منابع سیستم را بیهوده درگیر نکند. مایکروسافت قبلاً متد ValidateOnStart() و رابط IValidateOptions را برای بررسی زودهنگام ارائه داده بود. اما متد Validate کاملاً همگام (Synchronous) طراحی شده بود. این طراحی دو مشکل اساسی ایجاد می‌کرد:
    • انجام عملیات I/O به‌صورت همگام: توسعه‌دهندگان برای بررسی اتصالات خارجی (مانند اعتبارسنجی DNS یا پینگ یک API) ناچار به استفاده از الگوهای ضدطراحی مانند task.Result یا task.Wait() می‌شدند که خطر رخ‌داد Sync-over-Async و بن‌بست رشته‌ها (Thread Pool Starvation / Deadlock) را به همراه داشت.
    • چرخه حیات ناهمگام در هاست دات‌نت: با توجه به اینکه متد IHost.StartAsync() ناهمگام است، عدم پشتیبانی چرخه حیات اعتبارسنجی از فراخوانی‌های Asynchronous یک خلاء معماری به‌شمار می‌رفت.
    برای حل این چالش، اینترفیس IAsyncValidateOptions به همراه بازنگری در مکانیسم‌های اعتبارسنجی اولیه به هسته دات‌نت افزوده شده است.

    ۲. بررسی ساختار رابط‌های جدید و تغییرات کلیدی
    ۲.۱. معرفیIAsyncValidateOptions
    این رابط متد ValidateAsync را در دسترس قرار می‌دهد که به برنامه اجازه می‌دهد اعتبارسنجی‌های متکی به I/O را بدون مسدود کردن ترد اجرا کند:
    public interface IAsyncValidateOptions<TOptions> where TOptions : class
    {
        Task<ValidateOptionsResult> ValidateAsync(
            string? name, 
            TOptions options, 
            CancellationToken cancellationToken = default);
    }

    ۲.۲. منسوخ شدنIStartupValidatorو جایگزینی باIAsyncStartupValidator
    رابط قدیمی IStartupValidator که وظیفه جمع‌آوری و اجرای اعتبارسنجی‌ها در زمان شروع هاست را بر عهده داشت، اکنون با شناسه منسوخ‌سازی (Obsolete) نشاندار شده و جای خود را به IAsyncStartupValidator داده است. این تغییر به هاست اجازه می‌دهد تمامی متدهای ValidateAsync را به شکل کاملاً ناهمگام در حین اجرای پایپ‌لاین آغازین به سرانجام برساند.

    ۲.۳. سازگاری گذشته‌نگر در سورس‌ژنراتورها (Source Generators)
    ژنراتورهای کدی که از اعتبارسنجی مبتنی بر ویژگی‌ها (مانند DataAnnotations) پشتیبانی می‌کنند، اکنون هر دو پیاده‌سازی همگام (IValidateOptions) و ناهمگام (IAsyncValidateOptions) را تولید می‌کنند. این کار باعث می‌شود:
    • کدهای قدیمی که همچنان از اعتبارسنجی همگام استفاده می‌کنند بدون مشکل کار کنند.
    • فراخوانی‌های مدرن زمان شروع هاست مستقیماً از مسیر ناهمگام بهره ببرند.

    ۳. پیاده‌سازی نمونه عملی و بررسی کد
    کد زیر بررسی نام دامنه یک سرویس وابسته (Backend Host) از طریق جستجوی DNS ناهمگام را در زمان شروع برنامه نشان می‌دهد:
    #:sdk Microsoft.NET.Sdk.Web
    
    using System.Net;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Options;
    
    HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
    
    // پیکربندی و فعال‌سازی اعتبارسنجی در فاز راه‌اندازی
    builder.Services
        .AddOptions<BackendOptions>()
        .Configure(options =>
        {
            options.HostName = "api.internal.network";
        })
        .Validate<BackendOptionsValidator>()
        .ValidateOnStart();
    
    using IHost host = builder.Build();
    await host.StartAsync();
    
    public sealed class BackendOptions
    {
        public string HostName { get; set; } = string.Empty;
    }
    
    public sealed class BackendOptionsValidator : 
        IAsyncValidateOptions<BackendOptions>, 
        IValidateOptions<BackendOptions>
    {
        public async Task<ValidateOptionsResult> ValidateAsync(
            string? name,
            BackendOptions options,
            CancellationToken cancellationToken = default)
        {
            if (string.IsNullOrWhiteSpace(options.HostName))
            {
                return ValidateOptionsResult.Fail("نام میزبان سرویس بک‌اند مشخص نشده است.");
            }
    
            // بررسی ناهمگام آدرس IP متناظر با هاست
            DnsResult<AddressRecord> result =
                await Dns.ResolveAddressesAsync(options.HostName, cancellationToken);
    
            return result.ResponseCode == DnsResponseCode.NoError && result.Records.Count > 0
                ? ValidateOptionsResult.Success
                : ValidateOptionsResult.Fail(
                    $"امکان ارزیابی آدرس IP برای دامنه '{options.HostName}' وجود ندارد.");
        }
    
        // متد همگام به منظور ممانعت از فراخوانی همگام غیراصولی خطای معنادار صادر می‌کند
        public ValidateOptionsResult Validate(string? name, BackendOptions options) =>
            ValidateOptionsResult.Fail("اعتبارسنجی این تنظیمات صرفاً باید به صورت ناهمگام اجرا شود.");
    }
    تحلیل عملکرد کد:
    • متد ValidateOnStart(): در طول فراخوانی host.StartAsync()، سامانه هاست ارائه‌دهنده IAsyncStartupValidator را فراخوانی کرده و متد ValidateAsync را با CancellationToken مجاز اجرا می‌کند.
    • رفتار متد Validate همگام: در صورتی که بخشی از کدهای قدیمی یا کتابخانه‌های ثالث سعی کنند با متد همگام این نمونه را ارزیابی کنند، به‌جای بلاک کردن ترد با خطای صریح مواجه می‌شوند تا توسعه‌دهنده به استفاده از مدل ناهمگام هدایت شود.

    ۴. ملاحظات فنی، نکات تکمیلی و بهترین الگوها (Best Practices)
    اگرچه اعتبارسنجی ناهمگام دسترسی به I/O در زمان شروع برنامه را ممکن ساخته است، اما باید با دقت و طبق الگوهای زیر استفاده شود:

    ۱. تعیین مهلت زمانی (Timeout Handling)
    زمان اجرای اولیه نباید به خاطر تاخیرهای شبکه طولانی شود. حتماً CancellationToken ورودی متد را به متدهای داخلی پاس دهید و در صورت نیاز از CancellationTokenSource.CreateLinkedTokenSource با بازه زمانی مشخص (مانند ۳ الی ۵ ثانیه) استفاده کنید:
    using var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
    cts.CancelAfter(TimeSpan.FromSeconds(3));

    ۲. تفکیک مرز «اعتبارسنجی پیکربندی» از «بررسی سلامت» (Health Checks)
    • اعتبارسنجی ناهمگام گزینه‌ها: برای بررسی درستی اولیه فرمت و دسترسی‌پذیری حداقلی پیش‌نیازها در فاز اجرای هاست است (مثل وجود رکورد DNS یا خواندن گواهینامه از Key Vault).
    • بررسی سلامت (Health Checks): برای نظارت مداوم و دوره‌ای در چرخه حیات زنده بودن (Liveness) و آمادگی (Readiness) سیستم است. عملیات سنگین مثل اجرای تراکنش‌های تستی در پایگاه داده نباید به اعتبارسنجی Options منتقل شوند.

    ۳. مدیریت تنظیمات نام‌گذاری‌شده (Named Options)
    متغیر string? name در متدهای اعتبارسنجی نشان‌دهنده نام نمونه تنظیمات است. اگر از الگوهای چندگانه (Named Options) استفاده می‌کنید، همیشه بررسی کنید که آیا نام ارسالی با مورد مدنظر تطابق دارد یا برای تمام نمونه‌ها (name == Options.DefaultName) معتبر است.

    ۵. نتیجه‌گیری
    پشتیبانی از IAsyncValidateOptions و معرفی IAsyncStartupValidator گام مهمی در تکامل معماری پیکربندی دات‌نت است. این قابلیت به سیستم‌ها اجازه می‌دهد بدون قربانی کردن کارایی تردها یا نقض اصول غیرهمگام، با اطمینان بالا وابستگی‌های کلیدی را در بدو شروع راستی‌آزمایی کرده و در صورت بروز خطا بلافاصله متوقف شوند. با استفاده اصولی از این قابلیت همراه با رعایت سقف زمانی (Timeout)، تاب‌آوری و سلامت معماری برنامه‌های دات‌نت به‌طور چشمگیری ارتقا می‌یابد.