TGViewer
C# Geeks (.NET) C# Geeks (.NET) @csharpgeeks · 550 subscribers
Post #499 181
الگوی Options در ASP.NET Core 🎛

الگوی Options pattern از کلاس‌ها برای ارائهٔ دسترسی strongly typed به گروهی از تنظیمات مرتبط استفاده می‌کند.
وقتی تنظیمات پیکربندی (Configuration Settings) بر اساس سناریو در کلاس‌های جداگانه ایزوله می‌شوند، برنامه به دو اصل مهم مهندسی نرم‌افزار پایبند می‌ماند:

1. Encapsulation 🔐

کلاس‌هایی که به تنظیمات پیکربندی وابسته هستند، فقط به همان تنظیماتی وابسته‌اند که واقعاً استفاده می‌کنند.

2. Separation of Concerns 🧩

تنظیمات بخش‌های مختلف برنامه به یکدیگر وابسته یا Coupled نیستند.
ءOptions همچنین یک مکانیزم برای اعتبارسنجی داده‌های پیکربندی فراهم می‌کند.

ءBind کردن پیکربندی سلسله‌مراتبی 🔗

روش پیشنهادی برای خواندن مقادیر پیکربندی مرتبط، استفاده از Options Pattern است.

برای مثال، فرض کنید مقادیر پیکربندی زیر را داریم:
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}

ایجاد کلاس PositionOptions 📦
public class PositionOptions
{
public const string Position = "Position";

public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}

ویژگی‌های یک Options class✨️
یک کلاس Options باید:

• غیر abstract باشد.
• شامل propertyهای public read-write برای مقادیری باشد که در config وجود دارند.
• ءpropertyهای read-write آن مطابق با ورودی‌های configuration مقداردهی شوند.

• فیلدها (Fields) مقداردهی نمی‌شوند.
در مثال بالا، فیلد Position مقداردهی نمی‌شود و تنها برای جلوگیری از hard-code کردن رشتهٔ "Position" استفاده می‌شود.

ءBind کردن تنظیمات و نمایش مقدار 📥📤

کد زیر:
متد ConfigurationBinder.Bind را فراخوانی می‌کند تا کلاس PositionOptions را به سکشن Position bind کند.داده‌های پیکربندی Position را نمایش می‌دهد.
public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;

public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}

public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);

return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}

در کد فوق، به‌صورت پیش‌فرض، تغییرات فایل JSON configuration بعد از اجرای برنامه نیز خوانده می‌شوند. 🔄

استفاده از <ConfigurationBinder.Get<T✨️

متد <ConfigurationBinder.Get<T نوع مشخص‌شده را Bind کرده و همان نوع را برمی‌گرداند.
در بسیاری از موارد، استفاده از <ConfigurationBinder.Get<T راحت‌تر از ConfigurationBinder.Bind است.
کد زیر نحوهٔ استفاده از <Get<T با کلاس PositionOptions را نشان می‌دهد:
public class Test21Model : PageModel
{
private readonly IConfiguration Configuration;
public PositionOptions? positionOptions { get; private set; }

public Test21Model(IConfiguration configuration)
{
Configuration = configuration;
}

public ContentResult OnGet()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();

return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}

در کد بالا، به‌صورت پیش‌فرض، تغییرات فایل JSON configuration بعد از اجرای برنامه نیز خوانده می‌شوند. 🔄
More from @csharpgeeks
  1. Sep 22, 2026یه مدتی قراره از دنیای NET. فاصله بگیرم، چون وقتشه برم سربازی. راستش نمیدونم این مدت رو چج…
  2. Sep 20, 2026🔥 حالا مشکل اصلی: Alert Storm فرض کن Database از دسترس خارج شده. ۱۰۰ Pod داری. هر Pod می‌…
  3. Sep 20, 2026🚨 طراحی سیستم Monitoring و Alerting در یک سیستم بزرگ فرض کن ساعت ۳ صبح است. سیستم شما با…
  4. Sep 19, 2026#Engineering_Leadership تصمیم نگرفتن هم یک تصمیم است یه چیز عجیب توی تیم‌های مهندسی: گاهی…
  5. Sep 19, 2026☑ چک‌لیست آماده‌سازی تیم، فرایندها و زیرساخت برای توسعه با AI توجه: هیچ چک‌لیستی جهان‌شمول…
  6. Sep 19, 2026📌پایان یک انتظار طولانی: اعتبارسنجی ناهمگام (Async Validation) در NET 11.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →