[.net core 2]在.net core如何定義config還有如何去讀取

[.net core 2]在.net core如何定義config還有如何去讀取

前言

因為最近有一個專案是用.net core2去做的,算是公司內部在使用的網站,所以就開始花點時間研究起了.net core 2,老實說很多套件還不支援,甚至已經寫好的元件庫,在.net core 2有很大的機率無法順利使用,甚至也少了我們以前熟悉的web.config了,那我們的常數要寫在哪邊呢?

appsettings.json

沒錯目前已經都是用json來定義config的內容了,所以就沒有xml的格式了,看一下我自定義的Custom區塊

{
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  },
  "Custom": {
    "JiraConfig": {
      "Url": "http://localhost:8080/",
      "UserName": "anson.shih",
      "Password": "2131"
    }
  }
}

那麼我如何在程式裡面抓到呢?其實很簡單,我們只要使用IConfiguration並注入在建構子裡面就可以了,請看Startup.cs的部份,有一段程式碼如下

public Startup(IConfiguration configuration)      
{                                                 
    Configuration = configuration;                
}                                                 
                                                  
public IConfiguration Configuration { get; }      

其實我們如果要在程式碼使用的話,也可以直接在建構子注入,就可以使用了,但是如果我們在自定義的dll裡面又該怎麼辦呢?我們可以在nuget下載如下package

接著如果我要讀取我定義的json格式,只要如下方式使用即可。

        IConfiguration _configuration;
        public TestService(IConfiguration configuration)
        {
            _configuration = configuration;
            var url = _configuration["Custom:JiraConfig:Url"];
            var username = _configuration["Custom:JiraConfig:UserName"];
            var password = _configuration["Custom:JiraConfig:Password"];
        }

如果我們的json有陣列格式如下的話

  "Custom": {
    "JiraConfig": {
      "Url": "http://localhost:8080/",
      "Users": [
        {
          "UserName": "anson.shih",
          "Password": "2131"
        },
        {
          "UserName": "kinanson",
          "Password": "2131"
        }
      ]     
    }
  }

那我們就可以改成這樣子去取囉

var username1 = configuration["Custom:JiraConfig:Users:0:UserName"];
var username2 = configuration["Custom:JiraConfig:Users:1:UserName"];

用強型別的方式來讀取appsettings.json

首先我按照上述的json來定義相對應的類別

public class JiraConfigModel
{
    public static string Url { get; set; }
    public static List<Users> Users { get; set; }
}

public class Users
{
    public static string UserName { get; set; }
    public static string Password { get; set; }
}

接著在把Startup裡面的建構式改成如下

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
            var appConfig = new JiraConfigModel();
            configuration.GetSection("Custom:JiraConfig").Bind(appConfig);
            Debug.WriteLine($"Url is {appConfig.Url}");
            Debug.WriteLine($"User1 is {appConfig.Users[0].UserName}");
            Debug.WriteLine($"User2 is {appConfig.Users[1].UserName}");
        }

結果如下

結論

如果有任何更好的做法,再請指教筆者囉。