ASP.NET Core Configuration

在使用ASP.NET時,都是使用ConfigurationManager去存取config檔,但在ASP.NET Core改為注入的方式存取。除了讀取config檔外,還能從不同來源載入設定,最重要的是:讀進來後可以用強型別了。

我們在appsettings.json中加入一段自訂的參數

{
  "MySettings": {
    "Volume": 10,
    "IsMute": false,
    "Display": "1920*1080",
    "InputMapping": {
      "Up": "W",
      "Down": "S",
      "Left": "A",
      "Right": "D"
    }
  }
}

存取config檔時,先在constructer中注入IConfiguration

public HomeController(IConfiguration configuration)
{
    _configuration = configuration;
}

之後就能取到自訂參數了,階層是以:做區分

string volume = _configuration["MySettings:Volume"];
string moveUpKey = _configuration["MySettings:InputMapping:Up"];

但這樣做的缺點是取出的值都是字串,字串以外的型別就需要再另外做轉型。


如果要用強型別的話,首先建立對應的class。

public class MySettings
{
    public int Volume { get; set; }

    public bool IsMute { get; set; }

    public string Display { get; set; }

    public InputMappingOption InputMappings { get; set; }

    public class InputMappingOption
    {
        public string Up { get; set; }

        public string Down { get; set; }

        public string Left { get; set; }

        public string Right { get; set; }
    }
}

在Startup.cs加入強型別的自訂參數

public class Startup
{
    private IConfiguration _configuration;

    public Startup(IConfiguration configuration)
    {
        _configuration = configuration;
    }


    public void ConfigureServices(IServiceCollection services)
    {
        //在容器加入強型別的自訂設定
        services.Configure<MySettings>(_configuration.GetSection("MySettings"));
    }
}

constructer改成注入IOptions<T>

public HomeController(IOptions<MySettings> options)
{
    _mySettings = options.Value;
}

之後就能用強型別的自訂參數了,在開發上方便不少。

bool isMute = _mySettings.IsMute;
string moveDownKey = _mySettings.InputMappings.Down;

最後附上完整程式碼

參考資料: