[C#] .net 코어의 appsettings.json에서 가치 얻기

여기서 누락 된 것이 확실하지 않지만 .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

Startupappsettings 파일을로드하도록 지시 해야 합니다.

// 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>경우에만 응용 프로그램 설정에서 하나 개 또는 두 개의 값을 필요로하는 경우 잘 작동합니다. 그러나 앱 설정에서 여러 값을 가져 오거나 해당 키 문자열을 여러 위치에 하드 코딩하지 않으려면 옵션 패턴 을 사용하는 것이 더 쉬울 수 있습니다 . 옵션 패턴은 클래스를 사용하여 계층 / 구조를 나타냅니다.

옵션 패턴을 사용하려면

  1. 구조를 나타내는 클래스 정의
  2. 해당 클래스가 바인딩하는 구성 인스턴스를 등록하십시오.
  3. 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는 임의의 값으로 설정할 수 있지만 프레임 워크 DevelopmentStaging,, 및 세 개의 값을 지원합니다 Production. 경우 ASPNETCORE_ENVIRONMENT설정되지 않은, 그것은에 기본값으로 사용합니다 Production.

이 세 값의 이러한 appsettings.ASPNETCORE_ENVIRONMENT.json의 파일은 상자 밖으로 지원 – appsettings.Staging.json, appsettings.Development.jsonappsettings.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"
    }
  }