Programma e classe di avvio
.NET Core 2.x
Non è necessario novità IConfiguration
nel Startup
costruttore. La sua implementazione verrà iniettata dal sistema 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
Devi dire Startup
di caricare i file delle app.
// 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();
}
...
}
Ottenere valori
Esistono molti modi per ottenere il valore configurato dalle impostazioni dell'app:
- Modo semplice usando
ConfigurationBuilder.GetValue<T>
- Utilizzo del modello opzioni
Supponiamo che appsettings.json
assomigli a questo:
{
"ConnectionStrings": {
...
},
"AppIdentitySettings": {
"User": {
"RequireUniqueEmail": true
},
"Password": {
"RequiredLength": 6,
"RequireLowercase": true,
"RequireUppercase": true,
"RequireDigit": true,
"RequireNonAlphanumeric": true
},
"Lockout": {
"AllowedForNewUsers": true,
"DefaultLockoutTimeSpanInMins": 30,
"MaxFailedAccessAttempts": 5
}
},
"Recaptcha": {
...
},
...
}
Modo semplice
Puoi iniettare l'intera configurazione nel costruttore del tuo controller / classe (via IConfiguration
) e ottenere il valore desiderato con una chiave specificata:
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);
}
}
Modello di opzioni
La ConfigurationBuilder.GetValue<T>
grandi opere se avete solo bisogno di uno o due valori dai impostazioni dell'applicazione. Ma se vuoi ottenere più valori dalle impostazioni dell'app o non vuoi codificare queste stringhe chiave in più punti, potrebbe essere più facile usare il Pattern Opzioni . Il modello di opzioni utilizza le classi per rappresentare la gerarchia / struttura.
Per utilizzare il modello opzioni:
- Definire le classi per rappresentare la struttura
- Registrare l'istanza di configurazione a cui si associano tali classi
- Iniettare
IOptions<T>
nel costruttore del controller / classe su cui si desidera ottenere valori
1. Definire le classi di configurazione per rappresentare la struttura
Puoi definire le classi con proprietà che devono corrispondere esattamente alle chiavi nelle impostazioni dell'app. Il nome della classe non deve corrispondere al nome della sezione nelle impostazioni dell'app:
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. Registrare l'istanza di configurazione
E quindi è necessario registrare questa istanza di configurazione ConfigureServices()
all'avvio:
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. Iniettare IOpzioni
Infine sul controller / classe che si desidera ottenere i valori, è necessario iniettare IOptions<AppIdentitySettings>
tramite il costruttore:
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);
}
}