ASP.NET Core RC2 – mapowanie pliku konfiguracyjnego na POCO

Często tworzymy pewien “wrapper” dla wartości pochodzących z Web.Config, np.:

class Config
{
    public int MaxResults{get;set;}
}

Następnie np. w IoC inicjalizujemy obiekt wartościami pochodzącymi z Web.Config:

Config config = new Config();
config.MaxResults = ConfigutationManager.AppSettings["MaxResults].Value;

W ASP.NET Core istnieje łatwy sposób mapowania wartości bezpośrednio na klasę w C#. Oczywiście coś podobnego było i tak możliwe w starych wersjach ASP.NET, ale nie było to tak wygodne.

Załóżmy, że mamy następujący plik konfiguracyjny w ASP.NET Core (plik settings.json):

{
"ApplicationInsights": {
"InstrumentationKey": ""
},
"Config": {
"MaxResults": 15
},

"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
}

Przede wszystkim musimy zainstalować pakiet “Microsoft.Extensions.Options.ConfigurationExtensions”, np. poprzez dodanie odpowiedniego wpisu w project.json:

"Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0-rc2-final"

W Start.ConfigureService dodajemy następujący kod:

            services.AddOptions();
            services.Configure<Config>(Configuration.GetSection("Config"));

Pierwsza linia umożliwi m.in. wstrzyknięcie Config do kontrolera. Druga z kolei, naturalnie czyta wartości z pliku JSON. Samo wstrzyknięcie sprowadza się do zdefiniowania odpowiedniego konstruktora:

        private readonly IOptions<Config> _configValue;

        public HomeController(IOptions<Config> _configValue )
        {
            this._configValue = _configValue;
        }

         public IActionResult About()
        {
            ViewData["Message"] = _configValue.Value.MaxResults.ToString();

            return View();
        }

Dosyć zwięzłe rozwiązanie. Nie trzeba samemu wstrzykiwać do kontenera IoC czy nawet odczytywać konkretnych wartości z pliku konfiguracyjnego.

Leave a Reply

Your email address will not be published.