در asp.net core پارامترهایی مانند کانکشن استرینگ های دیتابیس, کانفیگ های مربوط به سرویس ها, دیتاهایی که به ندرت تغییر میکنند را در فایل appsettings.json قرار میدهند و هر زمان که نیاز باشد آنها را از appsettings.json دریافت کنند باید از IConfiguration استفاده کنند. در این مطلب به نحوه خواندن دیتاهای از appsettings.json میپردازیم. فایل appsettings.json زیر را در نظر بگیرید که میخواهیم مقدار پارامتر Name را درون کنترلر دریافت کنیم:

{
  "Name": "Farhad"
}

برای خواندن این دیتا اولین راه حل این است که توسط اینترفیس IConfiguration مقدار Name را دریافت کنیم. برای این کار ابتدا باید اینترفیس IConfiguration را از DI دریافت کنیم و درون متد مورد نظر مقدار پارامتر Name را دریافت کنیم:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private readonly IConfiguration _configuration;

    public WeatherForecastController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [HttpGet]
    public IActionResult Get()
    {
        var name = _configuration["Name"].ToString();
        return Ok(name);
    }
}

 در متد Get مقدار پارامتر Name را از IConfiguration دریافت کرده ایم و آنرا درون متغییر name قرار داده ایم. اینترفیس IConfiguration به root فایل appsettings.json اشاره دارد و پارامتر Name هم در root فایل appsettings.json قرار دارد و به همین دلیل میتوانیم به صورت مستقیم مقدار پارامتر Name را دریافت کنیم. اگر از اینترفیس IConfiguration برای خواندن دیتاها استفاده کنیم هر زمان که تغییری در فایل appsettings.json ایجاد شود, اینترفیس IConfiguration آخرین تغییرات را در اختیار ما قرار میدهد. به عنوان مثال اگر زمانی که  برنامه در حال اجراست و شما مقدار پارامتر Name را تغییر دهید, هنگامی که به متد Get میرسد آخرین تغییرات شما را در متغییر name قرار میدهد.

اگر ساختار پارامترهای شما در فایل appsettings.json به صورت یک آبجکت یا آرایه باشد, باید به نحو دیگری دیتاهارا بخوانید. ساختار فایل appsettings.json زیر را در نظر بگیرید که چند پارامتر کانکشن استرینگ در سکشن ConnectionStrings قرار دارد:

{
  "ConnectionStrings": {
    "SqlServer": "Data Source=.; Initial Catalog=ConfigurationDB; Integrated Security=True;",
    "MongoDb": "mongodb://localhost"
  }
}

اگر بخواهیم کانکشن مربوط به SqlServer را دریافت کنیم باید به صورت زیر عمل کنیم:

[HttpGet]
public IActionResult Get()
{
    var connectionString = _configuration["ConnectionStrings:SqlServer"].ToString();
    return Ok(connectionString);
}

باید بعد از نام سکشن مورد نظر علامت : را قرار دهیم. به همین صورت اگر در سکشن ConnectionStrings یک سکشن دیگر قرار داشته باشد میتوانیم با قرار دادن علامت : به سکشن های زیرین اشاره کنیم.

مشکل این روش آن است که هر بار که بخواهیم دیتایی را از appsettings.json بخوانیم باید به صورت دستی اسم سکشن ها و پارامترها را بنویسیم. راه حل این مشکل استفاده از مدل می باشد.یعنی یک کلاس ایجاد کنیم و پارامترهایی را که میخواهیم دریافت کنیم را به صورت پراپرتی درون مدل مورد نظر قرار دهیم. به طور مثال برای کانکشن استرینگ های قسمت بالا که دو کانشکن SqlServer و MongoDb قرار دارد باید یک کلاس به شکل زیر ایجاد کنیم:

public class ConnectionStrings
{
    public string SqlServer { get; set; }
    public string MongoDb { get; set; }
}

سپس باید در متد ConfigureService در کلاس Startup این کلاس را رجیستر کنیم:

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

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<ConnectionStrings>(a => Configuration.GetSection(nameof(ConnectionStrings)).Bind(a));

    services.AddControllers();
}

در متد Configure مشخص کرده ایم که برای کلاس ConnectionStrings باید دیتاها را از سکشن ( nameof(ConnectionStrings) ) که برابر همان ConnectionStrings است بخواند و مقدار آنها را در پراپرتی های کلاس ConnectionStrings قرار دهد. سپس برای خواندن اطلاعات از مدل رجیستر شده باید با استفاده از اینترفیس IOptions که در کتابخانه Microsoft.Extensions.Options قرار دارد به صورت زیر عمل کنیم:

private readonly ConnectionStrings _configuration;

public WeatherForecastController(IOptions<ConnectionStrings> configuration)
{
    _configuration = configuration.Value;
}

[HttpGet]
public IActionResult Get()
{
    var sqlServer = _configuration.SqlServer;
    return Ok(sqlServer);
}

با استفاده از این روش, در هر کجایی از برنامه که بخواهیم مقدار کانکشن استرینگ های SqlServe و MongoDb را دریافت کنیم نیازی نیست از IConfiguation استفاده کنیم و به صورت دستی تمامی اسم پراپرتی های آن را بنویسیم, فقط کافیست با استفاده از IOptions مدل آنرا دریافت کنیم و از پراپرتی های آن استفاده کنیم.

Powered by Froala Editor