ASP.NET Core MVC 組態檔取值

  • 962
  • 0
  • 2018-04-29

接觸過 ASP.NET MVC 的開發者,應該都對它的組態檔 web.config 有一定的熟悉。

而在 Core MVC ,相對應的組態檔是 appsettings.json,除了格式的改變(從 xml 到 json),因為 MVC 框架的一些調整,組態檔較順手的讀取方式也會有一些變化,

官方範本

使用 Visual Studio(2017 以上)新增專案在 .NET Core -> ASP.NET Core Web 應用程式,應該是最不自虐的方法了。

新增完,可以看到一些和 ASP.NET MVC 不同的地方

  • 程式常見的起點 Program.Main
  • Controller 的外部資料預設以注入的方式獲得
  • 組態檔也是注入

還有更多的變化,但以組態檔來說,這些比較值得關注。

比起 ASP.NET,Core 的 Program.Main 更明確地標示了程式的起點,並展示了它的載入方式,從而追到 Startup.cs,而 Startup 正是一連串注入的起點。

這次官方範本自帶簡單 DI(相依性注入) 框架,算是比較進階的技巧,想用地順手需要一些轉變,像是節制全域變數的使用。

因為 Controller 有用 DI ,如果有組態檔取值需求,最好也透過注入,這樣才能取得 DI 完整好處(像是 Controller 的解耦),自然也就會影響組態檔取值的寫法。

組態檔取值

Core MVC 組態檔取值,在 Startup 會比較方便,因為範本預設在 Startup 時注入組態檔,如下圖紅框

這裡大致說明 2 種取法

取單一值(string)

以下列添加了自訂屬性的 appsetting.json 為例

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-CoreMVC-12A003A5-6943-4029-BA12-9F252D7A3816;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "Customer": "God",
  "Author": {
    "Name": "Ligi",
    "Age": 18
  }
}

在 Startup 可以直接取值

Console.WriteLine(Configuration["Customer"]);
// God

Console.WriteLine(Configuration["Author:Name"]);
// Ligi

泛型

如果要在 Contoller 用到組態檔內容,比起全域變數,注入會是一個比較好的方式,可以在 Startup.ConfigureServices 註冊注入的物件。

例如當 HomeController 會用到 Author 的設定,可以先建一個 Author 的 Model

public class Author
{
    public string Name { get; set; }
    public int Age { get; set; }
}

將值塞進 Model,並註冊注入物件,框架就會在 Controller 建構子上對應的 type 進行注入

// 在 Startup.ConfigureServices 注入 appsetting 內容
var author = Configuration.GetSection("Author").Get<Author>();
services.AddSingleton(author);

最後

在 Startup 進行組態檔的操作,並不是唯一方法,只是比較漂亮有彈性。

在參考資料中就有提到如何透過 ConfigurationBuilder 對組態檔取值。

參考資料

Configuration in ASP.NET Core