الگوی 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 بعد از اجرای برنامه نیز خوانده میشوند. 🔄