پیکربندی ASP.NET Core 2.0

در این مقاله ابتدا به این پرسش که چگونه تنظیمات پیکربندی را از منابع مختلف بخوانیم و از آن ها در اپلیکیشن های خود استفاده کنیم؟با نمونه عملی گام به گام پاسخ می دهیم سپس با مثال یک معرفی از مکانیسم خواندن تنظیمات در ASP.NET Core و انواع آن ارائه خواهیم داد و درباره نوع عملکرد آن صحبت خواهیم کرد.

پیکربندی ASP.NET Core 2.0

مشکل

چگونه تنظیمات پیکربندی را از منابع مختلف بخوانیم و از آن ها در اپلیکیشن های خود استفاده کنیم؟

راه حل

از پروژه ی خالی پست قبل شروع می کنیم. فایل های appsettings.json و appsettings.Development.json را به پروژه ی خود اضافه کنید.

// appsettings.json  
{  
  "Section1": {  
    "SettingA": "ValueA",  
    "SettingB": "ValueB"  
  },  
  "Section2": {  
    "SettingC": "ValueC"  
  }  
}  
// appsettings.Development.json  
{  
  "Section1": {  
    "SettingA": "Dev_ValueA"  
  },  
  "Section2": {  
    "SettingC": "Dev_ValueC"  
  }  
}  

سپس تنظیمات پیکربندی را در سازنده ی کلاس Startup بخوانید. 

public static IConfiguration Config { get; private set; }  
  
public Startup(  
    IConfiguration config)  
{  
    Config = config;  
} 

سپس سرویس های option را در متد ConfigureServicees() که در کلاس Startup است اضافه کنید.

public void ConfigureServices(  
    IServiceCollection services)  
{  
    // setup dependency injection in service container  
    services.AddOptions();  
    services.Configure(Config);  
}

سرانجام تنظیمات را به عنوان یک interface از IOptions که T، POCO شما است وارد کنید.

public class HelloWorldMiddleware  
{  
    private readonly RequestDelegate next;  
    private readonly AppSettings settings;  
  
    public HelloWorldMiddleware(  
        RequestDelegate next,  
        IOptions options)  
    {  
        this.next = next;  
        this.settings = options.Value;  
    }  
  
    public async Task Invoke(HttpContext context)  
    {  
        var jsonSettings = JsonConvert.SerializeObject(this.settings);  
        await context.Response.WriteAsync(jsonSettings);  
    }  
}  

اجرای این اپلیکیشن مثالی خروجی  زیر را خواهد داشت.

بحث

ASP.NET Core یک مکانیزم ساده برای خواندن تنظیمات برنامه از منابع مختلف نظیر فایل JSON ، متغیر های محلی و یا حتی منابع داده های سفارشی است.همچنین استفاده از این تنظیمات به لطف Dependency Injection ساده است.

اگرچه این موضوع عجیب است ( چگونه تنظیمات شما بارگذاری می شود) اما ASP.NET Core 2.0 تنظیمات پیکربندی اضافه شده را پشت متد CreateDefaultBuilder() از WebHost  در Program.cs پنهان می کند . سپس IConfiguration به سرویس container اضافه می شود و در سراسر برنامه قابل دسترس می شود. از این موضوع در Startup برای اضافه کردن option ها استفاده کردیم. برای مشاهده ی آن متد  BuildWebHost() را در Program.cs جایگزین کنید و برنامه را دوباره اجرا کنید نهایتا دوباره همان نتیجه را خواهید گرفت.

public static IWebHost BuildWebHost(string[] args)  
{  
    return WebHost.CreateDefaultBuilder(args)  
                   .ConfigureAppConfiguration((context, builder) =>  
                   {  
                       var env = context.HostingEnvironment;  
  
                       builder.AddJsonFile("appsettings.json",   
                                    optional: true, reloadOnChange: true)  
                              .AddJsonFile($"appsettings.{env.EnvironmentName}.json",   
                                    optional: true, reloadOnChange: true);  
  
                       if (env.IsDevelopment())  
                       {  
                           var appAssembly = Assembly.Load(  
                               new AssemblyName(env.ApplicationName));  
                           if (appAssembly != null)  
                           {  
                               builder.AddUserSecrets(appAssembly, optional: true);  
                           }  
                       }  
  
                       builder.AddEnvironmentVariables();  
  
                       if (args != null)  
                       {  
                           builder.AddCommandLine(args);  
                       }  
                   })  
                   .UseStartup<Startup>()  
                   .Build();  
}

در solution بالا دو منبع فایل JSON ارائه شده است. موضوع مهمی که باید به خاطر داشته باشیم این است که این منابع به صورت ترتیبی خوانده می شوند و تنظیمات را از منبع قبلی بازنویسی می کنند. این موضوع را می توانید در solution بالا متوجه شوید خروجی نشان می دهد که مقدار تنظیمات B از فایل تنظیمات اول می آید که تنظیمات دیگر به وسیله ی فایل تنظیمات دوم بازنویسی می شوند.

توجه کنید که یک property استاتیک public نمونه ی IConfiguration را نگه می دارد بنابراین می تواند در سراسر اپلیکیشن به صورت زیر استفاده شود:

var valueA = Config["Section1:SettingA"]; 

اما یک روش بهتر نیز برای خواندن تنظیمات وجود دارد برای مثال : خواندن تنظیمات از یک کلاس نوع POCO و سپس انتقال آن به middleware ، controllers و غیره به عنوان یک وابستگی. در solution بالا از middleware که یکی از پست های قبل است برای نشان دادن این موضوع استفاده کردیم.

همچنین می توانید کلاس های POCO برای قسمت های مختلف فایل تنظیمات داشته باشید و آن ها را با استفاده از متد GetSection() در IConfiguration بخوانید.

services.Configure(Config.GetSection("Section1"));  

همچنین ممکن است تنظیمات در کد با استفاده از overload کردن،IServiceCollection.Configurethat که از لامبدایی از نوع strongly typed استفاده می‌کند، پر شود.

services.Configure(options =>  
{  
    options.Section1.SettingA = "SomeValue";  
});

سورس کد (اینجا)