โปรแกรมและคลาสเริ่มต้น
.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();
}
...
}
รับค่า
มีหลายวิธีที่คุณสามารถรับค่าที่คุณกำหนดจากการตั้งค่าแอพ:
สมมติว่า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>
ทำงานที่ยอดเยี่ยมหากคุณต้องการเพียงหนึ่งหรือสองค่าจากการตั้งค่าแอพ แต่ถ้าคุณต้องการที่จะได้รับค่าหลายรายการจากการตั้งค่า app หรือคุณไม่ต้องการที่จะยากรหัสสตริงที่สำคัญผู้ที่อยู่ในสถานที่ต่างๆก็อาจจะง่ายต่อการใช้รูปแบบตัวเลือก รูปแบบตัวเลือกใช้คลาสเพื่อแสดงลำดับชั้น / โครงสร้าง
วิธีใช้รูปแบบตัวเลือก:
- กำหนดคลาสเพื่อแสดงโครงสร้าง
- ลงทะเบียนอินสแตนซ์การกำหนดค่าที่คลาสเหล่านั้นผูกไว้
- ฉีด
IOptions<T>
เข้าไปใน Constructor ของคอนโทรลเลอร์ / คลาสที่คุณต้องการรับค่า
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>
ผ่าน Constructor:
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);
}
}