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/

原文地址:https://www.cnblogs.com/liumengchen-boke/p/8193051.html

时间: 2024-08-30 04:37:22

Core篇——初探Core配置管理的相关文章

Core篇——初探Core的认证,授权机制

目录 1.Cookie-based认证的实现 2.Jwt Token 的认证与授权 3.Identity Authentication + EF 的认证 Cookie-based认证的实现 cookie认证方式如下图所示,当我们访问一个网页(Admin/Index)时候,这时候系统会检查你是否有权限,假如没有权限,便会我当前Url重定向到登陆页面(/Account/Login),在登陆成功后,系统会返回一个cookie保存在浏览器,此时再带着这个cookie去重新访问你最开始要访问的页面(Adm

Core篇——初探IdentityServer4(客户端模式,密码模式)

Core篇--初探IdentityServer4(客户端模式,密码模式) 目录 1.Oatuth2协议的客户端模式介绍2.IdentityServer4客户端模式实现3.Oatuth2协议的密码模式介绍4.IdentityServer4密码模式实现 Oatuth2协议的客户端模式介绍 Client Credentials Grant (客户端模式)是Oauth2.0协议中,四种模式自建单的一种.它由两部分构成,客户端和认证服务器.认证服务器确认客户端无误后返回一个token,客户端请求带着tok

.net core WebAPI 初探及连接MySQL

1. 前言 笔者最近跟着微软官方文档学习.net core WebAPI,但发现其对 WebAPI 连接数据库.读取数据库方面讲得不够细致明了.写此文的目的,即实现 .net core WebAPI 的 GET.POST 方法访问数据库,并输出结果. 2. 开发准备 2.1 操作系统 Windows 10 / Windows 7 2.2 .net core sdk .net core 2.2 下载地址:https://dotnet.microsoft.com/download 2.3 开发工具

net Core 通过 Ef Core 访问、管理Mysql

net Core 通过 Ef Core 访问.管理Mysql 本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1.0.0-preview2-003131 本文分为Window环境和Mac Os X环境. 相关资源下载 Visual Studio Code:https://code.visualstudio.com DotNet Core:https://dotnet.github.io/ MySql.Data.

Introducing .NET Core(.NET Core介绍)

本菜鸟基本是个英盲,此篇外博是我用有道翻译的,好在内容还算简单,但愿不会误人子弟.英语好的同志们可直接去看原文:https://docs.asp.net/en/latest/getting-started/installing-on-windows.html,如果有人能重新翻译发布出来让大家学习那再好不过,省得我这种人一个一个地查单词. 欢迎指正! By Steve Smith 作者Steve Smith .NET Core is a small, optimized runtime that

NET Core &amp; Entity Framework Core

本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 官方文档分四部分 一. 教程文档 二.ABP 框架 三.zero 模块 四.其他(中文翻译资源) 本篇是第一部分的第一篇. 第一部分分三篇 1-1 手把手引进门 1-2 进阶 1-3 杂项 (相关理论知识) 第一篇含两个步骤. 1-1-1 ASP.NET Core & Entity Framework Core 后端(内核)含两篇 (第二篇链接) 1-1-2 ASP.NET MVC, Web API, EntityFramework &

.NET Core &amp; ASP.NET Core 1.0

.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布 众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项.这个团队已经一起工作好几个月了,RHEL对.NET有许多需求.今天在RedHat 峰会DevNation 上宣布了.NET Core & ASP.NET Core 1.0 RTM.Red Hat有一个新的关于在RHEL上更简单的使用.NET Core的选项.(DevNatio

linux下如何产生core,调试core

linux下如何产生core,调试core 摘自:http://blog.163.com/[email protected]/blog/static/19554784201131791239753/ 在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息).使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数. 1.core文件的生成开关和大小限制 1)使用ulimit -c命令可查看core文件的生成开关.若结果为0,则表示关闭了此

.NET Core &amp; ASP.NET Core 1.0在Redhat峰会上正式发布

众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项.这个团队已经一起工作好几个月了,RHEL对.NET有许多需求.今天在RedHat 峰会DevNation 上宣布了.NET Core & ASP.NET Core 1.0 RTM.Red Hat有一个新的关于在RHEL上更简单的使用.NET Core的选项.(DevNation是一场全栈开发大会,将共同探讨开源的最优秀特性.DevNation 2016由50多场小分