接觸過 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 對組態檔取值。