🧠 Options Pattern Validation در ASP.NET Core با FluentValidation
اگر با Options Pattern در ASP.NET Core کار کرده باشید، احتمالاً با اعتبارسنجی داخلی DataAnnotations آشنا هستید.
هرچند این روش ساده و کاربردیست، اما وقتی نوبت به سناریوهای پیچیدهتر میرسد، محدودیتهای خودش را نشان میدهد.
📦 Options Pattern
به شما اجازه میدهد تا مقادیر تنظیمات (configuration) را بهصورت کلاسهای strongly-typed در زمان اجرا دریافت کنید.
اما یک مشکل وجود دارد:
🔸 شما نمیتوانید مطمئن باشید که مقادیر پیکربندی واقعاً معتبر هستند تا زمانیکه از آنها استفاده کنید!
راهحل؟
✅ اعتبارسنجی تنظیمات در زمان راهاندازی (Startup) برنامه.
در این پست یاد میگیریم چطور با ترکیب FluentValidation و Options Pattern،
یک سیستم اعتبارسنجی قدرتمند بسازیم که در startup اجرا میشود و از بروز خطاهای پیکربندی جلوگیری میکند.
⚖️ چرا FluentValidation بهتر از DataAnnotations است؟
در حالیکه DataAnnotations برای اعتبارسنجیهای ساده کافی است،FluentValidation امکانات بیشتری ارائه میدهد:
✨ قوانین اعتبارسنجی انعطافپذیرتر و خواناتر
⚙️ پشتیبانی از شرایط پیچیده و شرطی
🧩 جداسازی تمیز منطق اعتبارسنجی از مدلها
🧪 امکان تست سادهی قوانین
🧠 پشتیبانی بهتر از منطق سفارشی
🔌 قابلیت تزریق وابستگیها در Validatorها
⚙️ درک چرخهٔ حیات Options Pattern در ASP.NET Core
قبل از اینکه وارد جزئیات اعتبارسنجی بشیم، لازمه چرخهٔ حیات (Lifecycle) گزینهها در ASP.NET Core رو درک کنیم 👇
1️⃣ گزینهها در Container وابستگی (DI Container) ثبت میشن.
2️⃣ مقادیر پیکربندی (Configuration Values) به کلاسهای Options متصل میشن.
3️⃣ اگر اعتبارسنجی پیکربندی شده باشه، در این مرحله اجرا میشه.
4️⃣ گزینهها هنگام فراخوانی از طریق یکی از این اینترفیسها resolve میشن:
• IOptions<T>
• IOptionsSnapshot<T>
• IOptionsMonitor<T>
🧩 متد ()ValidateOnStart باعث میشه اعتبارسنجی در زمان راهاندازی (Startup) برنامه انجام بشه،
نه وقتی که برای اولین بار Options مورد استفاده قرار میگیرن.
⚠️ خطاهای رایج پیکربندی بدون اعتبارسنجی
بدون اعتبارسنجی، مشکلات پیکربندی میتوانند به چند شکل ظاهر شوند:
خطاهای خاموش (Silent failures): یک گزینهی پیکربندی اشتباه ممکن است باعث شود مقادیر پیشفرض بدون هیچ هشداری استفاده شوند.
🔹️ استثناهای زمان اجرا (Runtime exceptions): مشکلات پیکربندی ممکن است تنها وقتی که برنامه تلاش میکند مقادیر نامعتبر را استفاده کند، ظاهر شوند.
🔹️ خطاهای زنجیرهای (Cascading failures): یک کامپوننت پیکربندیشده نادرست میتواند باعث شکست سیستمهای وابسته شود.
با اعتبارسنجی در زمان Startup برنامه، یک چرخه بازخورد سریع ایجاد میکنید که از بروز این مشکلات جلوگیری میکند. ✅