文章目錄
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/