Nie som si istý, čo mi chýba, ale nie som schopný získať hodnoty z appsettings.json v mojej aplikácii .net core. Môj appsettings.json je:
{
"AppSettings": {
"Version": "One"
}
}
Spustenie:
public class Startup
{
private IConfigurationRoot _configuration;
public Startup(IHostingEnvironment env)
{
_configuration = new ConfigurationBuilder()
}
public void ConfigureServices(IServiceCollection services)
{
//Here I setup to read appsettings
services.Configure<AppSettings>(_configuration.GetSection("AppSettings"));
}
}
Model:
public class AppSettings
{
public string Version{ get; set; }
}
Ovládač:
public class HomeController : Controller
{
private readonly AppSettings _mySettings;
public HomeController(IOptions<AppSettings> settings)
{
//This is always null
_mySettings = settings.Value;
}
}
_mySettings
je vždy null. Je tu niečo, čo mi uniká?
Vďaka @Kirk za upozornenie, že by som nemal predpokladať, že je to .NET Core 2.0!
V konštruktore Startup
nemusíte vytvárať novú IConfiguration
. Jeho implementácia bude injektovaná systémom DI.
// Program.cs
public Trieda Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
// Startup.cs
public class Startup
{
public IHostingEnvironment HostingEnvironment { get; private set; }
public IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
this.HostingEnvironment = env;
this.Configuration = configuration;
}
}
Musíte povedať Startup
, aby načítal súbory appsettings.
// Program.cs
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.Run();
}
}
//Startup.cs
verejná trieda Startup
{
public IConfigurationRoot Configuration { get; private set; }
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", voliteľné: true)
.AddEnvironmentVariables();
this.Configuration = builder.Build();
}
...
}
Existuje mnoho spôsobov, ako môžete získať hodnotu, ktorú ste nakonfigurovali z nastavení aplikácie:
ConfigurationBuilder.GetValue<T>
appsettings.json
vyzerá takto:{
"ConnectionStrings": {
...
},
"AppIdentitySettings": {
"User": {
"RequireUniqueEmail": true
},
"Password": {
"RequiredLength": 6,
"RequireLowercase": true,
"RequireUppercase": true,
"RequireDigit": true,
"RequireNonAlphanumeric": true
},
"Lockout":
"AllowedForNewUsers": true,
"DefaultLockoutTimeSpanInMins": 30,
"MaxFailedAccessAttempts":
}
},
"Recaptcha": {
...
},
...
}
Celú konfiguráciu môžete injektovať do konštruktora vášho kontroléra/triedy (prostredníctvom IConfiguration
) a získať požadovanú hodnotu so zadaným kľúčom:
public class AccountController : Controller
{
private readonly IConfiguration _config;
public AccountController(IConfiguration config)
{
_config = config;
}
[AllowAnonymous]
public IActionResult ResetPassword(int userId, string code)
{
var vm = new ResetPasswordViewModel
{
PasswordRequiredLength = _config.GetValue<int>(
"AppIdentitySettings:Password:RequiredLength"),
RequireUppercase = _config.GetValue<bool>(
"AppIdentitySettings:Password:RequireUppercase")
};
return View(vm);
}
}
Príkaz ConfigurationBuilder.GetValue<T>
funguje skvele, ak potrebujete len jednu alebo dve hodnoty z nastavení aplikácie. Ak však chcete získať viacero hodnôt z nastavení aplikácie alebo nechcete tieto kľúčové reťazce tvrdo kódovať na viacerých miestach, môže byť jednoduchšie použiť Options Pattern. Vzor options používa triedy na reprezentáciu hierarchie/štruktúry.
Ak chcete použiť vzor options:
IOptions<T>
do konštruktora kontroléra/triedy, na ktorej chcete získať hodnotyMôžete definovať triedy s vlastnosťami, ktoré musia presne zodpovedať kľúčom v nastaveniach aplikácie. Názov triedy nemusí'zodpovedať názvu sekcie v nastaveniach aplikácie:
public class AppIdentitySettings
{
public UserSettings User { get; set; }
public PasswordSettings Password { get; set; }
public LockoutSettings Lockout { get; set; }
}
verejná trieda UserSettings
{
public bool RequireUniqueEmail { get; set; }
}
public class PasswordSettings
{
public int RequiredLength { get; set; }
public bool RequireLowercase { get; set; }
public bool RequireUppercase { get; set; }
public bool RequireDigit { get; set; }
public bool RequireNonAlphanumeric { get; set; }
}
public class LockoutSettings
{
public bool AllowedForNewUsers { get; set; }
public int DefaultLockoutTimeSpanInMins { get; set; }
public int MaxFailedAccessAttempts { get; set; }
}
A potom musíte túto konfiguračnú inštanciu zaregistrovať v príkazoch ConfigureServices()
pri spustení:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
...
namespace DL.SO.UI.Web
{
public class Startup
{
...
public void ConfigureServices(IServiceCollection services)
{
...
var identitySettingsSection =
_configuration.GetSection("AppIdentitySettings");
services.Configure<AppIdentitySettings>(identitySettingsSection);
...
}
...
}
}
Nakoniec v kontroléri/triede, z ktorej chcete získať hodnoty, musíte prostredníctvom konštruktora injektovať IOptions<AppIdentitySettings>
:
public class AccountController : Controller
{
private readonly AppIdentitySettings _appIdentitySettings;
public AccountController(IOptions<AppIdentitySettings> appIdentitySettingsAccessor)
{
_appIdentitySettings = appIdentitySettingsAccessor.Value;
}
[AllowAnonymous]
public IActionResult ResetPassword(int userId, string code)
{
var vm = new ResetPasswordViewModel
{
PasswordRequiredLength = _appIdentitySettings.Password.RequiredLength,
RequireUppercase = _appIdentitySettings.Password.RequireUppercase
};
return View(vm);
}
}
Doplnenie odpovede Davida Lianga na otázku Core 2.0 -
Súbor appsettings.json
je prepojený s premennou ASPNETCORE_ENVIRONMENT
.
ASPNETCORE_ENVIRONMENT
možno nastaviť na ľubovoľnú hodnotu, ale framework podporuje tri hodnoty: Development
, Staging
a Production
. Ak ASPNETCORE_ENVIRONMENT
nie je nastavená, bude predvolená hodnota Production
.
Pre tieto tri hodnoty sú z výroby podporované tieto súbory appsettings.ASPNETCORE_ENVIRONMENT.json - appsettings.Staging.json
, appsettings.Development.json
a appsettings.Production.json
Uvedené tri súbory json s nastaveniami aplikácie možno použiť na konfiguráciu viacerých prostredí.
Príklad - appsettings.Staging.json
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"System": "Information",
"Microsoft": "Information"
}
},
"MyConfig": "My Config Value for staging."
}
Na získanie akejkoľvek konfiguračnej hodnoty použite Configuration["config_var"]
.
public class Startup
{
public Startup(IHostingEnvironment env, IConfiguration config)
{
Environment = env;
Configuration = config;
var myconfig = Configuration["MyConfig"];
}
public IConfiguration Configuration { get; }
public IHostingEnvironment Environment { get; }
}
Stačí vytvoriť súbor AnyName.cs a vložiť nasledujúci kód.
using System;
using System.IO;
using Microsoft.Extensions.Configuration;
namespace Custom
{
static class ConfigurationManager
{
public static IConfiguration AppSetting { get; }
static ConfigurationManager()
{
AppSetting = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("YouAppSettingFile.json")
.Build();
}
}
}
Musíte nahradiť názov súboru YouAppSettingFile.json názvom vášho súboru.
Váš súbor .json by mal vyzerať nasledovne.
{
"GrandParent_Key" : {
"Parent_Key" : {
"Child_Key" : "value1"
}
},
"Parent_Key" : {
"Child_Key" : "value2"
},
"Child_Key" : "value3"
}
Teraz ho môžete používať.
Nezabudnite Pridať odkaz vo vašej triede, kde chcete použiť.
using Custom;
Kód na získanie hodnoty.
string value1 = ConfigurationManager.AppSetting["GrandParent_Key:Parent_Key:Child_Key"];
string value2 = ConfigurationManager.AppSetting["Parent_Key:Child_Key"];
string value3 = ConfigurationManager.AppSetting["Child_Key"];