Loading

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/

posted @ 2018-01-04 23:47  3WLineCode  阅读(727)  评论(0编辑  收藏  举报