راهنمای جامع مدیریت تنظیمات در داتنت کور: IConfiguration, IOptions
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۶/۱۶ ۱۰:۴۳
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
appsettings.json خود چنین ساختاری داشته باشید:{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning"
}
},
"MySettings": {
"ApiKey": "abc-123",
"MaxRetries": 3
}
}using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
public class MyService
{
private readonly IConfiguration _configuration;
private readonly ILogger<MyService> _logger;
public MyService(IConfiguration configuration, ILogger<MyService> logger)
{
_configuration = configuration;
_logger = logger;
}
public void DoSomething()
{
string apiKey = _configuration["MySettings:ApiKey"];
_logger.LogInformation($"API Key: {apiKey}");
}
}public class MySettings
{
public const string SectionName = "MySettings";
public string ApiKey { get; set; }
public int MaxRetries { get; set; }
}ConfigureServices در فایل Program.cs یا Startup.cs، بخش مربوطه از تنظیمات را به کلاس MySettings متصل (bind) میکنید:builder.Services.Configure<MySettings>(
builder.Configuration.GetSection(MySettings.SectionName));using Microsoft.Extensions.Options;
public class MyService
{
private readonly MySettings _settings;
public MyService(IOptions<MySettings> settings)
{
_settings = settings.Value;
}
public void DoSomething()
{
string apiKey = _settings.ApiKey;
// استفاده از مقادیر
}
}IOptions به کلاس شما اجازه میدهد تا فقط به بخشی از تنظیمات که به آن نیاز دارد دسترسی داشته باشد، که این امر وابستگیها را کاهش داده و کد را تمیزتر میکند. اما IOptions مقادیر را فقط یک بار در زمان راهاندازی برنامه (application startup) میخواند و از تغییرات در حین اجرای برنامه پشتیبانی نمیکند.appsettings.json در حین اجرای برنامه تغییر کند، هر درخواست جدید، مقدار بهروزرسانی شده را دریافت میکند. این رابط به طور خاص برای برنامههای وب مناسب است و به عنوان یک سرویس با عمر scoped ثبت میشود، بنابراین هر درخواست، نسخهی مستقل و تازهای از تنظیمات را دریافت میکند.IOptionsMonitor به عنوان یک سرویس تکگانه (singleton) عمل کرده و همیشه آخرین مقدار تنظیمات را از طریق ویژگی CurrentValue ارائه میدهد. علاوه بر این، IOptionsMonitor به شما اجازه میدهد تا به تغییرات تنظیمات مشترک شوید و اقداماتی را در پاسخ به آنها انجام دهید.using Microsoft.Extensions.Options;
public class BackgroundWorker
{
private readonly IOptionsMonitor<MySettings> _settingsMonitor;
public BackgroundWorker(IOptionsMonitor<MySettings> settingsMonitor)
{
_settingsMonitor = settingsMonitor;
_settingsMonitor.OnChange((updatedSettings, name) =>
{
// این کد در زمان تغییر تنظیمات اجرا میشود
Console.WriteLine($"Settings changed. New API Key: {updatedSettings.ApiKey}");
});
}
public void DoWorkContinuously()
{
// دسترسی به آخرین مقدار در هر لحظه
string currentApiKey = _settingsMonitor.CurrentValue.ApiKey;
// استفاده از currentApiKey
}
}IOptions<T>IOptionsSnapshot<T>IOptionsMonitor<T>IOptions<T>، IOptionsSnapshot<T> و IOptionsMonitor<T>، توسعهدهندگان میتوانند کدی ایمنتر، قابل نگهداریتر و انعطافپذیرتر ایجاد کنند.IOptions<T>، IOptionsSnapshot<T> و IOptionsMonitor<T> به دلیل ارائه دسترسی قویتایپ و پشتیبانی از بهروزرسانیهای پویا، رویکرد بهتری محسوب میشوند. انتخاب هر یک از این رابطها به نیازهای خاص برنامه شما، مانند نوع برنامه (سرویس طولانیمدت یا برنامه وب) و نیاز به بهروزرسانی تنظیمات در زمان اجرا، بستگی دارد. با درک دقیق این ابزارها، میتوانید به بهترین شکل از پتانسیل کامل فریمورک داتنت کور بهرهمند شوید.IOptionsSnapshot به طور خاص برای سناریوهای وب طراحی شده و در هر درخواست یک کپی تازه از تنظیمات را ارائه میدهد، که این امر به اطمینان از دریافت جدیدترین مقادیر در هر درخواست کمک میکند. IOptionsMonitor نیز از بهروزرسانی پشتیبانی میکند اما به عنوان یک سرویس تکگانه (singleton) عمل کرده و برای سرویسهای طولانیمدت مناسبتر است.