여기서 누락 된 것이 확실하지 않지만 .net 핵심 응용 프로그램의 appsettings.json에서 값을 가져올 수 없습니다. appsettings.json은 다음과 같습니다.
{
"AppSettings": {
"Version": "One"
}
}
시작 :
public class Startup
{
private IConfigurationRoot _configuration;
public Startup(IHostingEnvironment env)
{
_configuration = new ConfigurationBuilder()
}
public void ConfigureServices(IServiceCollection services)
{
//Here I setup to read appsettings
services.Configure<AppSettings>(_configuration.GetSection("AppSettings"));
}
}
모델:
public class AppSettings
{
public string Version{ get; set; }
}
제어 장치:
public class HomeController : Controller
{
private readonly AppSettings _mySettings;
public HomeController(IOptions<AppSettings> settings)
{
//This is always null
_mySettings = settings.Value;
}
}
_mySettings
항상 null입니다. 내가 여기서 놓친 것이 있습니까?
답변
프로그램 및 스타트 업 수업
.NET 코어 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 코어 1.x
Startup
appsettings 파일을로드하도록 지시 해야 합니다.
// 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. I 옵션 주입
마지막으로 컨트롤러 / 클래스에서 값을 얻으려면 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);
}
}
답변
AnyName.cs 파일을 만들고 다음 코드를 붙여 넣으십시오.
using System;
using System.IO;
using Microsoft.Extensions.Configuration;
namespace Custom
{
static class ConfigurationManager
{
public static IConfiguration AppSetting { get; }
static ConfigurationManager()
{
AppSetting = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("YouAppSettingFile.json")
.Build();
}
}
}
YouAppSettingFile.json 파일 이름을 파일 이름으로 바꿔야합니다.
.json 파일은 다음과 같아야합니다.
{
"GrandParent_Key" : {
"Parent_Key" : {
"Child_Key" : "value1"
}
},
"Parent_Key" : {
"Child_Key" : "value2"
},
"Child_Key" : "value3"
}
이제 사용할 수 있습니다. 수업에 참고 자료
를 추가하는 것을 잊지 마십시오 .
using Custom;
값을 검색하는 코드입니다.
string value1 = ConfigurationManager.AppSetting["GrandParent_Key:Parent_Key:Child_Key"];
string value2 = ConfigurationManager.AppSetting["Parent_Key:Child_Key"];
string value3 = ConfigurationManager.AppSetting["Child_Key"];
답변
Core 2.0에 대한 David Liang의 답변 추가 –
appsettings.json
파일은 ASPNETCORE_ENVIRONMENT
변수 에 연결됩니다 .
ASPNETCORE_ENVIRONMENT
는 임의의 값으로 설정할 수 있지만 프레임 워크 Development
는 Staging
,, 및 세 개의 값을 지원합니다 Production
. 경우 ASPNETCORE_ENVIRONMENT
설정되지 않은, 그것은에 기본값으로 사용합니다 Production
.
이 세 값의 이러한 appsettings.ASPNETCORE_ENVIRONMENT.json의 파일은 상자 밖으로 지원 – appsettings.Staging.json
, appsettings.Development.json
및appsettings.Production.json
위의 세 가지 응용 프로그램 설정 json 파일을 사용하여 여러 환경을 구성 할 수 있습니다.
예 – appsettings.Staging.json
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"System": "Information",
"Microsoft": "Information"
}
},
"MyConfig": "My Config Value for staging."
}
Configuration["config_var"]
구성 값을 검색하는 데 사용하십시오 .
public class Startup
{
public Startup(IHostingEnvironment env, IConfiguration config)
{
Environment = env;
Configuration = config;
var myconfig = Configuration["MyConfig"];
}
public IConfiguration Configuration { get; }
public IHostingEnvironment Environment { get; }
}
답변
가장 간단한 방법은 DI입니다. 컨트롤러에 도달하는 예입니다.
// StartUp.cs
public void ConfigureServices(IServiceCollection services)
{
...
// for get appsettings from anywhere
services.AddSingleton(Configuration);
}
public class ContactUsController : Controller
{
readonly IConfiguration _configuration;
public ContactUsController(
IConfiguration configuration)
{
_configuration = configuration;
// sample:
var apiKey = _configuration.GetValue<string>("SendGrid:CAAO");
...
}
}
답변
Startup 클래스의 생성자에서 주입 된 IConfiguration 객체를 사용하여 appsettings.json 및 기타 여러 설정에 액세스 할 수 있습니다.
Startup.cs 생성자
public Startup(IConfiguration configuration)
{
Configuration = configuration;
//here you go
var myvalue = Configuration["Grandfather:Father:Child"];
}
public IConfiguration Configuration { get; }
appsettings.json의 내용
{
"Grandfather": {
"Father": {
"Child": "myvalue"
}
}
답변
public static void GetSection()
{
Configuration = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json")
.Build();
string BConfig = Configuration.GetSection("ConnectionStrings")["BConnection"];
}
답변
필자의 경우 Configuration 객체에서 Bind () 메서드를 사용하는 것이 간단했습니다. 그런 다음 DI에서 개체를 싱글 톤으로 추가하십시오.
var instructionSettings = new InstructionSettings();
Configuration.Bind("InstructionSettings", instructionSettings);
services.AddSingleton(typeof(IInstructionSettings), (serviceProvider) => instructionSettings);
Instruction 객체는 원하는만큼 복잡 할 수 있습니다.
{
"InstructionSettings": {
"Header": "uat_TEST",
"SVSCode": "FICA",
"CallBackUrl": "https://UATEnviro.companyName.co.za/suite/webapi/receiveCallback",
"Username": "s_integrat",
"Password": "X@nkmail6",
"Defaults": {
"Language": "ENG",
"ContactDetails":{
"StreetNumber": "9",
"StreetName": "Nano Drive",
"City": "Johannesburg",
"Suburb": "Sandton",
"Province": "Gauteng",
"PostCode": "2196",
"Email": "ourDefaultEmail@companyName.co.za",
"CellNumber": "0833 468 378",
"HomeNumber": "0833 468 378",
}
"CountryOfBirth": "710"
}
}