Программа и класс Startup
.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);
}
}
person
David Liang
schedule
25.10.2017