ASP.NET 5 入門 (2) – 自定義配置
初步理解ASP.NET5的配置
正如我的第一篇文章ASP.NET 5 (vNext) 理解和概述 所說,ASP.NET 5的具有全新的配置機制,我們可以通過以下幾點來進行理解:
- 支持多種跨平台的配置文件格式(如XML, Json, Ini和環境變量)
- 標准的配置文件如project.json不再包括任何自定義的配置信息.
- 自定義的配置完全由開發者另行建立和加載
- 自定義的配置信息可以通過依賴注入向全項目發放
建立自定義配置文件
首先我們在項目的根目錄加入自定義的配置文件,config.json和config.ini (這里的文件名是可以任意定義的).
Config.json的內容我們模擬如下
{ "AppSettings": { "SiteTitle": "ASP.NET 5 Sample" }, "Data": { "DefaultConnection": { "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=ASPNET5;Trusted_Connection=True;MultipleActiveResultSets=true" } } }
Config.Ini的內容我們模擬如下:
DefaultPage=index.html
加載配置文件
之前也曾經提過,我們一般通過Startup類的構造函數來加載配置文件. Startup類的配置文件一般這樣定義.
public Startup(IHostingEnvironment env) { }
在最小模板,如果讀取Json和ini文件,我們需要加入ConfigurationModel.Json的組件:
然后我們可以加入下面的代碼來讀取任意json文件,ini文件和系統環境變量
public Startup(IHostingEnvironment env) { // 加載自定義的Json配置文件和INI配置文件 var configuration = new Configuration() .AddJsonFile("config.json") .AddIniFile("config.ini"); //加入系統的環境變量 configuration.AddEnvironmentVariables(); }
使用配置信息
加載完畢以后,利用上述代碼中產生的configuration變量就能很方便的讀取各種配置信息,這里提醒下,在以對象結構保存的配置信息中, Configuration類用”:”來實現對對象屬性的導航,不太理解的可以看下面的代碼:
//嘗試輸出一些配置信息 //對應config.json的Data.DefaultConnection.ConnectionString Console.WriteLine(configuration["Data:DefaultConnection:ConnectionString"]); //對應config.ini的DefaultPage Console.WriteLine(configuration["DefaultPage "]); //對應系統環境里面的Path Console.WriteLine(configuration["Path"]);
裝載配置到環境容器
在Startup類中,我們可以很方便的通過一個成員變量來傳遞的configuration變量,比較常見的寫法可以類似下面的代碼
private IConfiguration Configuration { get; set; } public Startup(IHostingEnvironment env) { // 加載自定義的Json配置文件和INI配置文件 var configuration = new Configuration() .AddJsonFile("config.json") .AddIniFile("config.ini"); //加入系統的環境變量 configuration.AddEnvironmentVariables(); //賦值給成員變量 Configuration = configuration; }
但如果在整個項目中,就需要利用依賴注入技術把配置信息裝載到環境容器中去,才能在整個項目中被靈活的調用.
在我前一篇博文關於啟動類的描述中,曾經提及 Startup的ConfigureServices函數就是負責裝載所有依賴注入服務的函數,所以我們需要在那里加入裝載代碼:
public void ConfigureServices(IServiceCollection services) { //把Configuration對象放入服務容器 services.AddInstance(typeof(IConfiguration), Configuration); }
注意這里的Configration是成員變量.
在其他區域使用配置
如何在項目的其他地方使用配置信息呢? 針對ASP.NET 5的依賴注入方式,我們一般有2種選擇.
- 通過擴展任何在同一容器中的對象的構造函數的參數,來隱式的加載其他服務元素,這種方式略有晦澀,但非常簡潔.(這種方式將在以后的MVC 6和EF 7介紹中再着重討論)
- 通過當前上下文(在很多場合都可以通過我們的老朋友HttpContext獲取)中的ApplicationServices屬性,獲取相對應的服務元素.
這里我們還沒有加載MVC或者EF,我們就以Startup類的Configure函數來做一個示范:
第一種模式代碼示例:
public void Configure(IApplicationBuilder app,IConfiguration configuration) { //從當前容器中讀出配置信息 Console.WriteLine(configuration["DefaultPage"]); Console.WriteLine(configuration["AppSettings:SiteTitle"]); }
注意, IConfiguration configuration參數的隱式 轉換是因為之前我們已經把Configuration加入Service容器. 如果沒有之前的注冊,這里的代碼會報錯.
第二種模式代碼示例:
public void Configure(IApplicationBuilder app) { var configuration = (IConfiguration)app.ApplicationServices.GetService(typeof(IConfiguration)); //從當前容器中讀出配置信息 Console.WriteLine(configuration["DefaultPage"]); Console.WriteLine(configuration["AppSettings:SiteTitle"]); }
在后續的常見對象里,比如MVC的Controller,和EF的DbContext等,我們能夠很便利的利用這2種方式獲取整個項目的配置信息.
好了,利用上面說到的方法,我們已經可以非常靈活在ASP.NET 5項目中,設置配置文件,加載配置文件,和使用配置信息,而且基於MVC服務,我們還可以對配置信息進行進一步的封裝,
ASP.NET5的配置機制是不是很方便. 還有人想念web.config嗎?