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.