Merci @Kirk de m'avoir signalé que je ne devais pas supposer qu'il s'agissait de .NET Core 2.0 !
Programme et classe de démarrage
.NET Core 2.x
Vous n'avez pas besoin de nouvelles IConfiguration
dans le Startup
constructeur. Son implémentation sera injectée par le système DI.
// Program.cs
public class 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;
}
}
.NET Core 1.x
Vous devez dire Startup
pour charger les fichiers 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
public class 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", optional: true)
.AddEnvironmentVariables();
this.Configuration = builder.Build();
}
...
}
Obtenir des valeurs
Il existe de nombreuses façons d'obtenir la valeur que vous avez configurée dans les paramètres de l'application :
- Une façon simple d'utiliser
ConfigurationBuilder.GetValue<T>
- Utilisation de Motif des options
Disons que votre appsettings.json
ressemble à ça :
{
"ConnectionStrings": {
...
},
"AppIdentitySettings": {
"User": {
"RequireUniqueEmail": true
},
"Password": {
"RequiredLength": 6,
"RequireLowercase": true,
"RequireUppercase": true,
"RequireDigit": true,
"RequireNonAlphanumeric": true
},
"Lockout": {
"AllowedForNewUsers": true,
"DefaultLockoutTimeSpanInMins": 30,
"MaxFailedAccessAttempts": 5
}
},
"Recaptcha": {
...
},
...
}
Une méthode simple
Vous pouvez injecter l'ensemble de la configuration dans le constructeur de votre contrôleur/classe (par le biais de l'option IConfiguration
) et obtenir la valeur que vous voulez avec une clé spécifiée :
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);
}
}
Motif des options
Le site ConfigurationBuilder.GetValue<T>
fonctionne très bien si vous n'avez besoin que d'une ou deux valeurs des paramètres de l'application. Mais si vous souhaitez obtenir plusieurs valeurs à partir des paramètres de l'application, ou si vous ne voulez pas coder en dur ces chaînes de caractères à plusieurs endroits, il peut être plus facile d'utiliser la méthode suivante Motif des options . Le modèle des options utilise des classes pour représenter la hiérarchie/structure.
Pour utiliser le modèle d'options :
- Définir des classes pour représenter la structure
- Enregistrer l'instance de configuration contre laquelle ces classes se lient.
- Injecter
IOptions<T>
dans le constructeur du contrôleur/classe sur lequel vous voulez obtenir des valeurs.
1. Définir des classes de configuration pour représenter la structure
Vous pouvez définir des classes avec des propriétés qui doivent correspondre exactement les clés dans les paramètres de votre application. Le nom de la classe ne doit pas nécessairement correspondre au nom de la section dans les paramètres de l'application :
public class AppIdentitySettings
{
public UserSettings User { get; set; }
public PasswordSettings Password { get; set; }
public LockoutSettings Lockout { get; set; }
}
public class 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; }
}
2. Enregistrez l'instance de configuration
Et ensuite, vous devez enregistrer cette instance de configuration dans le fichier ConfigureServices()
dans le démarrage :
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);
...
}
...
}
}
3. Injecter des IOptions
Enfin, sur le contrôleur/classe où vous voulez récupérer les valeurs, vous devez injecter IOptions<AppIdentitySettings>
par le biais du constructeur :
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);
}
}
3 votes
S'il vous plaît lire la documentation sur la façon d'utiliser la configuration. Vous avez mal défini la configuration dans votre classe de démarrage.
1 votes
Cela peut être encore simplifié en utilisant simplement l'injection de dépendances de IConfiguration. Ce qui est expliqué ici coding-issues.com/2018/10/
4 votes
Le fait qu'il y ait autant de réponses très différentes à cette question souligne le problème. Je me demande presque s'il n'est pas plus simple de lire le fichier de paramètres et de le désérialiser vers un objet créé avec un générateur de classe json -> c# en ligne. Avoir des paramètres qui ne sont pas fortement typés me semble primitif.