Ответ 1
Спасибо @Kirk за указание на то, что я не должен это понимать .NET Core 2.0!
Программа и класс запуска
.NET Core 2.x
Вам не нужно новый IConfiguration
в конструкторе Startup
. Его реализация будет внедрена системой 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
Вы должны указать Startup
загрузить файлы настроек приложения.
// 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();
}
...
}
Получение значений
Существует множество способов получить значение, которое вы настраиваете в настройках приложения:
- Простой способ с помощью
ConfigurationBuilder.GetValue<T>
- Использование шаблона параметров
Допустим, ваш appsettings.json
выглядит так:
{
"ConnectionStrings": {
...
},
"AppIdentitySettings": {
"User": {
"RequireUniqueEmail": true
},
"Password": {
"RequiredLength": 6,
"RequireLowercase": true,
"RequireUppercase": true,
"RequireDigit": true,
"RequireNonAlphanumeric": true
},
"Lockout": {
"AllowedForNewUsers": true,
"DefaultLockoutTimeSpanInMins": 30,
"MaxFailedAccessAttempts": 5
}
},
"Recaptcha": {
...
},
...
}
Простой способ
Вы можете вставить всю конфигурацию в конструктор вашего контроллера/класса (через IConfiguration
) и получить желаемое значение указанным ключом:
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);
}
}
Шаблон параметров
ConfigurationBuilder.GetValue<T>
прекрасно работает, если вам нужно только одно или два значения из настроек приложения. Но если вы хотите получить несколько значений из настроек приложения или не хотите жестко кодировать эти строки ключей в нескольких местах, может быть проще использовать шаблон параметров. Шаблон параметров использует классы для представления иерархии/структуры.
Чтобы использовать шаблон параметров:
- Определите классы для представления структуры
- Зарегистрируйте экземпляр конфигурации, с которым эти классы связывают
- Вставьте
IOptions<T>
в конструктор контроллера/класса, значения которого вы хотите получить в
1. Определите классы конфигурации для представления структуры
Вы можете определить классы со свойствами, которые должны точно соответствовать ключам в настройках вашего приложения. Имя класса не обязательно должно совпадать с именем раздела в настройках приложения:
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. Зарегистрировать экземпляр конфигурации
А затем вам нужно зарегистрировать этот экземпляр конфигурации в ConfigureServices()
при запуске:
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. Внедрить IOptions
Наконец, в контроллере/классе, который вы хотите получить значения, вам нужно вставить 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);
}
}