Core篇——初探Core配置管理

文章目錄

1、命令行配置

2、Json文件配置

3、配置文件文本至C#對象實例的映射

4、配置文件熱更新

5、總結

 命令行的配置

 我們首先來創建一個.net core 的控制檯項目,然後引入.net core all 包(Install-Package Microsoft.AspNetCore.All -Version 2.0.3),接下來添加系統參數。右鍵項目屬性,調試,如下圖(這裏的參數爲 =》name=lmc age=15):接下來,我們控制檯打印一下

 

 1 static void Main(string[] args)
 2 {
 3     //系統參數
 4     var builder = new ConfigurationBuilder()
 5         .AddCommandLine(args);
 6     var configration = builder.Build();
 7     Console.WriteLine($"name :{configration["name"]}");
 8     Console.WriteLine($"age :{configration["age"]}");
 9     Console.ReadLine();
10 }

 接下來讓我們把應用程序參數刪除,從內存中添加默認參數。ConfigurationBuilder對象的AddInMemoryCollection方法接收一個鍵值對的數組,我們這裏用一個字典來初始化默認參數

 1         static void Main(string[] args)
 2         {    
 3             //默認參數
 4             var dic = new Dictionary<string, string>
 5             {
 6                 { "name","liumengchen"},
 7                 { "age","18"}
 8             };
 9             //系統參數
10             var builder = new ConfigurationBuilder()
11                 .AddInMemoryCollection(dic)             //從內存中加載參數配置
12                 .AddCommandLine(args);
13             var configration = builder.Build();
14             Console.WriteLine($"name :{configration["name"]}");
15             Console.WriteLine($"age :{configration["age"]}");
16             Console.ReadLine();
17         }

Json文件配置

  我們在項目中添加一個"MyClass.json" 文件,ConfigurationBuilder的擴展方法AddJsonFile添加json配置文件,我們看到ConfigurationRoot的Providers中存儲着json文件讀取出來的數據,然後讓我們來打印一下=》

 1             var builder = new ConfigurationBuilder()
 2                 .AddJsonFile("MyClass.json");
 3             var configRetion = builder.Build();
 4 
 5             Console.WriteLine($"classId:{configRetion["classId"]}");
 6 
 7             var entitys = configRetion.Providers;
 8             
 9             Console.WriteLine("**************************指定索引打印**************************");
10             Console.WriteLine($"studentId:{configRetion["student:0:id"]}");
11             Console.WriteLine($"studentname:{configRetion["student:0:name"]}");
12             Console.WriteLine($"studentId:{configRetion["student:1:id"]}");
13             Console.WriteLine($"studentname:{configRetion["student:1:name"]}");
14             Console.WriteLine($"studentId:{configRetion["student:2:id"]}");
15             Console.WriteLine($"studentname:{configRetion["student:2:name"]}");

 配置文件文本至C#對象實例的映射

  創建一個空的mvc項目,將上一步的json文件 複製到這個項目中,並且改名爲appsettings.json(因爲Program.cs 中  BuildWebHost方法中,默認將appsettings.json寫入配置)。然後我們創建一個類,名字叫做MyClass=>

 1     public class MyClass
 2     {
 3         public string classId { get; set; }
 4         public List<student> student { get; set; }
 5     }
 6     public class student
 7     {
 8         public int id { get; set; }
 9         public string name { get; set; }
10     }

我們在Startup 中添加一個 IConfiguration,然後再構造函數中注入

1     public class Startup
2     {
3         public IConfiguration configuration { get; set; } 
4         public Startup(IConfiguration Configuration)
5         {
6             this.configuration = Configuration;
7         }

接下來,我們讀取配置文件中的內容

 1         public void Configure(IApplicationBuilder app, IHostingEnvironment env)
 2         {
 3             if (env.IsDevelopment())
 4             {
 5                 app.UseDeveloperExceptionPage();
 6             }
 7 
 8             app.Run(async (context) =>
 9             {
10                 MyClass myClass = new MyClass();
11                 configuration.Bind(myClass); //這裏的Bind方法,將配置文件中的內容綁定到myClass實例
12                 await context.Response.WriteAsync($"classId:{myClass.classId}");
13                 await context.Response.WriteAsync($"studentId:{myClass.student[0].id}");
14                 await context.Response.WriteAsync($"studentname:{myClass.student[0].name}");
15                 await context.Response.WriteAsync($"studentId:{myClass.student[1].id}");
16                 await context.Response.WriteAsync($"studentname:{myClass.student[1].name}");
17                 await context.Response.WriteAsync($"studentId:{myClass.student[2].id}");
18                 await context.Response.WriteAsync($"studentname:{myClass.student[2].name}");
19             });
20         }

 接下來我們將配置文件讀取到MVC的視圖中去。首先添加一個Home控制器,在控制器中注入MyClass,代碼修改爲如下:

 1     public class HomeController : Controller
 2     {
 3         public readonly MyClass _myClass;
 4         public HomeController(IOptions<MyClass> myClass)
 5         {
 6             _myClass = myClass.Value;
 7         }
 8         public IActionResult Index()
 9         {
10             return View(_myClass);
11         }
12     }

修改我們的startup.cs 和添加Index.cshtml,將視圖的model設置爲MyClass

 1         public void ConfigureServices(IServiceCollection services)
 2         {
 3             services.Configure<MyClass>(configuration); //註冊IConfiguration,讓控制器中IOptions讀到appsettings
 4             services.AddMvc();
 5         }
 6 
 7         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
 8         public void Configure(IApplicationBuilder app, IHostingEnvironment env)
 9         {
10             if (env.IsDevelopment())
11             {
12                 app.UseDeveloperExceptionPage();
13             }
14             app.UseMvcWithDefaultRoute();//添加路由中間件
15             app.UseMvc(routes =>
16             {
17                 routes.MapRoute(
18                     name: "default",
19                     template: "{controller=Home}/{action=Index}/{id?}");
20             });
      }
 1 @model MVCConfigApplication.MyClass
 2 
 3 @{
 4     ViewData["Title"] = "Index";
 5 }
 6 
 7 <h2>Index</h2>
 8 
 9 <h4>Class Id:@Model.classId</h4>
10 
11 @foreach(var entity in @Model.student)
12 {
13     <ul>
14         <li>studentId:@entity.id</li>
15         <li>studentId:@entity.name</li>
16     </ul>
17 
18 }

接下來讓我們來看一下結果=》

當然,我們也可以不使用控制器,在視圖中直接注入MyClass。我們在HomeController中刪除依賴注入的代碼,修改Index.cshtml代碼如下:

 1     public class HomeController : Controller
 2     {
 3         public IActionResult Index()
 4         {
 5             return View();
 6         }
 7     }
8 @using Microsoft.Extensions.Options 9 @inject IOptions<MVCConfigApplication.MyClass> MyClass 10 11 @{ 12 ViewData["Title"] = "Index"; 13 } 14 15 <h2>Index</h2> 16 <h4>Class Id:@MyClass.Value.classId</h4> 17 @foreach(var entity in @MyClass.Value.student) 18 { 19 <ul> 20 <li>studentId:@entity.id</li> 21 <li>studentId:@entity.name</li> 22 </ul> 23 24 }

配置文件熱更新

將IOptions 改爲IOptionsSnapshot

 

 在asp.net core 中,WebHost.CreateDefaultBuilder(args)  方法中,默認加載appsettings.json文件,並且將是否更改重新加載設置爲true

 

 這裏是github webhost.cs源碼: 

所以我們想關閉熱更新只需要將WebHost的ConfigureAppConfiguration方法中 config.AddJsonFile第三個參數設置爲false就可以了。=》 config.AddJsonFile("appsettings.json", false, false);

總結一下

在框架配置中,有兩個最重要的對象。第一個是IConfigurationSource,第二個是IConfigurationProvider。IConfigurationSource 在實例化 ConfigurationBuilder時候,可以把不同的Source添加至builder,例如Program中的BuildWebHost方法,最後使用生成器模式統一生成(Build),追加到IConfigurationProvider當中。讀取時候,就根據IConfigurationProvider當中是否存在"Key",把對應的值讀取出來。

 

 

 

 Jesse博客學習筆記。傳送門=》 http://video.jessetalk.cn/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章