zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    Java 重载机制
    网关、DNS、子网掩码、MAC地址、路由器、猫
    前台?后台?前端?后端?
    JSP初学
    PS笔记
    Pandorabox等类OpenWrt的路由器 实现后端设备接入IPV6(中继代理+NAT)
    三星S5_G9008V 解锁联通4G(安卓6.0)
    一个意外的发现
    硬改路由器-MW310R-AR9341篇
    关于使用硬改的路由器的各种经历
  • 原文地址:https://www.cnblogs.com/liumengchen-boke/p/8193051.html
Copyright © 2011-2022 走看看