Programme et classe de démarrage
.NET Core 2.x
Vous n'avez pas besoin de nouveau IConfiguration
dans le Startup
constructeur. Sa mise en œuvre 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
de charger les fichiers de paramètres d'application.
// 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 configurez à partir des paramètres de l'application:
- Utilisation simple
ConfigurationBuilder.GetValue<T>
- Utilisation du modèle d'options
Disons que votre appsettings.json
apparence ressemble à ceci:
{
"ConnectionStrings": {
...
},
"AppIdentitySettings": {
"User": {
"RequireUniqueEmail": true
},
"Password": {
"RequiredLength": 6,
"RequireLowercase": true,
"RequireUppercase": true,
"RequireDigit": true,
"RequireNonAlphanumeric": true
},
"Lockout": {
"AllowedForNewUsers": true,
"DefaultLockoutTimeSpanInMins": 30,
"MaxFailedAccessAttempts": 5
}
},
"Recaptcha": {
...
},
...
}
Manière simple
Vous pouvez injecter toute la configuration dans le constructeur de votre contrôleur / classe (via IConfiguration
) et obtenir la valeur souhaitée 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);
}
}
Modèle d'options
Cela 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 souhaitez pas coder en dur ces chaînes de clé à plusieurs endroits, il peut être plus facile d'utiliser le modèle d'options. . Le modèle d'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
- Enregistrez l'instance de configuration à laquelle ces classes se lient
- Injectez
IOptions<T>
dans le constructeur du contrôleur / classe sur lequel vous voulez obtenir des valeurs
1. Définissez les classes de configuration pour représenter la structure
Vous pouvez définir des classes avec des propriétés qui doivent correspondre exactement aux 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 puis vous devez enregistrer cette instance de configuration 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 IOptions
Enfin, sur le contrôleur / la classe dont vous souhaitez obtenir les valeurs, vous devez injecter IOptions<AppIdentitySettings>
via le 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);
}
}