پیکربندی (Configuration) در ASP.NET Core

شنبه 7 مرداد 1396

در این مقاله به بررسی کامل Configuration در ASP.NET Core می پردازیم و انواع روش های موجود برای استفاده از Configuration را به صورت پروژه های عملی آموزش خواهیم داد.

پیکربندی (Configuration) در ASP.NET Core

-- مقدمه

ASP.NET Core بسیاری از متدهای configuration را پشتیبانی می کند. در برنامه های ASP.NET Core، مقادیر configuration به صورت مجموعه های name-value ذخیره می شوند و این مقادیر باید در زمان اجرای برنامه توسط قسمت های مختلف برنامه، قابل دسترسی باشند.

گاهی مجموعه های name-value به صورت گروه بندی شده در یک ساختار سلسله مراتبی استفاده می شوند. داده های configuration  یک برنامه می تواند از روش های زیر بدست بیاید.

-فایل هایی مانند JSON، XML، INI

-مقادیر محیطی (Environment variable)

-آرگومان های خط فرمان (Command Line argument)

-مجموعه داخل حافظه ایی (An in-memory collection)

-ارائه دهندگان سفارشی (Custom providers)

Configuration System در ASP.NET Core در واقع یک بازسازی از ورژن قبلی ASP.NET است. در ورژن قبلی از فضای نام System.Configuration استفاده می شد که قابلیت خواندن فایل های XML configuration مانند web.config را داشت. ولی در مدل جدید configuration، می توان به مقادیری که مبتنی بر روش key/value هستند، دسترسی داشت و همچنین توانایی دسترسی به منابع مختلفی مانند JSON، XML و INI وجود دارد.


-- مثال برای خواندن configuration به کمک JSON provider

معمولا وقتی از فایل های خارجی استفاده می کنیم، configuration در ساختار key/value یا ساختار سلسله مراتبی ذخیره خواهد شد. محتویات فایل appsetting.json که برای پروژه همین مثال است در زیر آمده است.

appSetting.json

    {  
        "status" : "This Status read from appSettings.json file",  
        "ConnectionStrings": {  
            "DefaultConnection": "Server=.\\sqlexpress;Database=Test;Trusted_Connection=True;MultipleActiveResultSets=true"  
        }  
    }  

برای خواندن یک configuration فایل که از نوع JSON است، نیاز است که کتابخانه های Microsoft.Extensions.Configuration و Microsoft.Extensions.Configuration.Json را به عنوان وابستگی به پروژه اضافه کنیم. دو خطی که در زیر آمده است، نیاز است که در داخل فایل package.json در بخش dependency افزوده شوند.

    "Microsoft.Extensions.Configuration":"1.0.0",  
    "Microsoft.Extensions.Configuration.Json":"1.0.0"  

متد AddJsonFile که در کلاس JsonConfigurationExtensions وجود دارد از فایل JSON به عنوان سازنده استفاده می کند. ما می توانیم به سادگی مقادیر configuration را به وسیله نام کلید آن دریافت کنیم. اگر مقدار configuration در ساختار سلسله مراتبی باشد، می توانیم از ":" برای جدا سازی کلید استفاده کنیم و به راحتی به اطلاعات دسترسی پیدا کنیم.

در این مثال اگر ما بخواهیم مقدار DefaultConnection را پیدا کنیم، پس باید از کلید به شکل ConnectionStrings:DefaultConnection استفاده کنیم.

Starpup.cs

    using Microsoft.AspNetCore.Builder;  
    using Microsoft.AspNetCore.Http;  
    using Microsoft.Extensions.Configuration;  
    using Microsoft.Extensions.DependencyInjection;  
      
    namespace WebApplication  
    {  
        public class Startup {  
            public IConfiguration Configuration { get; set; }  
            public Startup() {   
             var builder = new ConfigurationBuilder()     
                .AddJsonFile("appSettings.json");   
             Configuration = builder.Build();   
          }    
            public void ConfigureServices(IServiceCollection services)  
            {             
                services.AddMvc();  
            }  
            public void Configure(IApplicationBuilder app){  
                app.UseMvc();     
                app.Run(context => {  
                    var status = Configuration["status"];   
                    var connectionString = Configuration["ConnectionStrings:DefaultConnection"];  
                    context.Response.WriteAsync("Default Connection: " + connectionString);  
                    context.Response.WriteAsync("<br/>");  
                    return context.Response.WriteAsync("Status: "+status);   
                });   
            }  
        }  
    }  

-- بازیابی Configuration Data در کنترلر

در مثال ذکر شده در بالا، ما مقادیر configuration را در همان کلاس startup دریافت می کنیم. وژن جدید ASP.NET دارای یک built-in support برای تزریق وابستگی است. با استفاده از DI ما می توانیم مقدار configuration را به یک کنترلر تزریق کنیم.

با استفاده از متد AddSingleton از کلاس ServiceCollectionServiceExtensions، ما می توانیم یک سرویس singleton از یک نوع خاص به همراه یک نمونه از سرویس بسازیم.

Startup.cs
    public void ConfigureServices(IServiceCollection services)  
    {             
                services.AddMvc();  
                services.AddSingleton<IConfiguration>(Configuration);  
    }  

HomeController.cs

    using Microsoft.AspNetCore.Mvc;  
    using Microsoft.Extensions.Configuration;  
      
    public class HomeController : Controller  
    {  
        IConfiguration _configuration;  
        public HomeController(IConfiguration configuration)  
        {  
            _configuration = configuration;  
        }  
        [Route("home/index")]  
        public IActionResult Index()  
        {  
            ViewBag.connectionstring = _configuration["ConnectionStrings:DefaultConnection"];  
            return View();  
        }  
    }  


-- دریافت شی Configuration به کمک options pattern

استفاده از Options pattern ما را قادر می سازد تا بتوانیم از کلاس های custom option برای ارائه یک گروه از تنظیمات مربوط به هم، استفاده کنیم. کلاس Option باید خصوصیت public read-write را داشته باشد و این خصوصیت را برای تمامی تنظیمات نیز داشته باشد و این کلاس نباید پارامتر ورودی داشته باشد.

در این پروژه وابستگی های ما شامل کتابخانه Microsoft.Extensions.Options.ConfigurationExtensions می شود. این وابستگی شامل extension method برای IServiceCollection.Configure است. نیاز است که این وابستگی را در فایل project.json اضافه کنیم.

    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0"  

در اینجا ما model را تعریف کرده ایم و از همان appSetting.json که در مثال قبلی بود استفاده می کنیم. در این مثال ما تنظیمات connection string در appSetting.json را به کمک کلاس زیر مدیریت کرده ایم.

    public class ConnectionString   
    {  
        public ConnectionString()  
        {  
        }  
        public string DefaultConnection { get; set; }  
        public string MainDBConnectionString { get; set; }  
    }  

در قطعه کد زیر، سرویس IConfigureOptions<TOptions> در داخل Service Container اضافه شده است. این کار باعث می شود که کلاس ConnectionStrings به بخش "ConnectionStrings" در داخل appsettings.json متصل شود.

Startup.cs

    public void ConfigureServices(IServiceCollection services)  
    {             
          
        services.AddOptions();  
          
        //Configure Option using Extensions method  
        services.Configure<ConnectionString>(Configuration.GetSection("ConnectionStrings"));  
          
        services.AddSingleton<IConfiguration>(Configuration);  
        services.AddMvc();  
    }  

با استفاده از IOptions<TOptions> ما می توانیم Option ها را به داخل برنامه تزریق کنیم. برای برپایی سرویس IOptions<TOptions> ما نیاز داریم تا یک extension method با نام AddOptions را در زمان اجرای متد ConfigureServices که در کلاس Startup قرار دارد، فراخوانی کنیم.

HomeController.cs

    using Microsoft.AspNetCore.Mvc;  
    using Microsoft.Extensions.Options;  
      
    public class HomeController : Controller  
    {  
        ConnectionString _connectionstring;  
        public HomeController(IOptions<ConnectionString> connectionstringAccessor)  
        {  
            _connectionstring = connectionstringAccessor.Value;  
        }  
        [Route("home/index")]  
        public IActionResult Index()  
        {  
            ViewBag.connectionstring = _connectionstring.DefaultConnection;  
            return View();  
        }  
    }  

--کار کردن با In-memory provider

چارچوب جدید configuration در ASP.NET Core از روش in-memory configuration پشتیبانی می کند. در این مدل از configuration، مقدار به صورت مستقیم در داخل کد ذخیره می شود و بخش بعدی برنامه از این configuration استفاده می کند. در قطعه کد زیر نحوه استفاده از in-memory provider برای ارسال به کلاس استفاده می شود.

    public Startup()  
    {  
            var builder = new ConfigurationBuilder();  
      
            var dic = new Dictionary<string, string>  
            {  
                {"Profile:FirstName", "Jignesh"},  
                {"Profile:LastName", "Trivedi"},  
                {"Profile:Designation", "PL"}  
            };  
            builder.AddInMemoryCollection(dic);  
            Configuration = builder.Build();  
    }  

با استفاده از Configuration["Profile:FirstName"]، ما می توانیم مقدار firstname پروفایل configuration را دریافت کنیم. همچنین ما می توانیم این مقدار را به کمک یک custom model بدست بیاوریم. در اینجا ما کلاس Profile زیر را ساخته ایم تا به سادگی مقادیر را بدست بیاریم.



    public class Profile  
    {  
        public string FirstName { get; set;}  
        public string LastName { get; set;}  
        public string Designation { get; set;}  
    }  

کدهای زیر نحوه اتصال به یک پروفایل و استفاده از options pattern را در یک برنامه ASP.NET Core MVC نشان می دهند.

Startup.cs 

    public void ConfigureServices(IServiceCollection services)  
    {  
        services.AddOptions();  
        services.Configure<Profile>(Configuration.GetSection("Profile"));  
        services.AddMvc();  
    }  

HomeController.cs

    using Microsoft.AspNetCore.Mvc;  
    using Microsoft.Extensions.Configuration;  
    using Microsoft.Extensions.Options;  
      
    public class HomeController : Controller  
    {  
        Profile _profile;  
        public HomeController(IOptions<Profile> Profile)  
        {  
            _profile = Profile.Value;  
        }  
        [Route("home/index")]  
        public IActionResult Index()  
        {  
            ViewBag.FirstName = _profile.FirstName;  
            return View();  
        }  
    }  

خروجی برنامه

آموزش asp.net mvc

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید