天天看點

ASP.NET 5 入門 (2) – 自定義配置

ASP.NET 5 入門 (2) – 自定義配置

ASP.NET 5 了解和入門

建立和開發ASP.NET 5 項目

初步了解ASP.NET5的配置

正如我的第一篇文章ASP.NET 5 (vNext) 了解和概述 所說,ASP.NET 5的具有全新的配置機制,我們可以通過以下幾點來進行了解:

  1. 支援多種跨平台的配置檔案格式(如XML, Json, Ini和環境變量)
  2. 标準的配置檔案如project.json不再包括任何自定義的配置資訊.
  3. 自定義的配置完全由開發者另行建立和加載
  4. 自定義的配置資訊可以通過依賴注入向全項目發放

建立自定義配置檔案

首先我們在項目的根目錄加入自定義的配置檔案,config.json和config.ini (這裡的檔案名是可以任意定義的).

ASP.NET 5 入門 (2) – 自定義配置

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的元件:

ASP.NET 5 入門 (2) – 自定義配置

然後我們可以加入下面的代碼來讀取任意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種選擇.

  1. 通過擴充任何在同一容器中的對象的構造函數的參數,來隐式的加載其他服務元素,這種方式略有晦澀,但非常簡潔.(這種方式将在以後的MVC 6和EF 7介紹中再着重讨論)
  2. 通過目前上下文(在很多場合都可以通過我們的老朋友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嗎?

軟體開發,項目管理,開發管理,團隊管理.

CMMI,PMP