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):接下来,我们控制台打印一下


static void Main(string[] args)
{
//系统参数
var builder = new ConfigurationBuilder()
.AddCommandLine(args);
var configration = builder.Build();
Console.WriteLine($"name :{configration["name"]}");
Console.WriteLine($"age :{configration["age"]}");
Console.ReadLine();
}
接下来让我们把应用程序参数删除,从内存中添加默认参数。ConfigurationBuilder对象的AddInMemoryCollection方法接收一个键值对的数组,我们这里用一个字典来初始化默认参数
static void Main(string[] args)
{
//默认参数
var dic = new Dictionary<string, string>
{
{ "name","liumengchen"},
{ "age",""}
};
//系统参数
var builder = new ConfigurationBuilder()
.AddInMemoryCollection(dic) //从内存中加载参数配置
.AddCommandLine(args);
var configration = builder.Build();
Console.WriteLine($"name :{configration["name"]}");
Console.WriteLine($"age :{configration["age"]}");
Console.ReadLine();
}

Json文件配置
我们在项目中添加一个"MyClass.json" 文件,ConfigurationBuilder的扩展方法AddJsonFile添加json配置文件,我们看到ConfigurationRoot的Providers中存储着json文件读取出来的数据,然后让我们来打印一下=》



var builder = new ConfigurationBuilder()
.AddJsonFile("MyClass.json");
var configRetion = builder.Build(); Console.WriteLine($"classId:{configRetion["classId"]}"); var entitys = configRetion.Providers; Console.WriteLine("**************************指定索引打印**************************");
Console.WriteLine($"studentId:{configRetion["student:0:id"]}");
Console.WriteLine($"studentname:{configRetion["student:0:name"]}");
Console.WriteLine($"studentId:{configRetion["student:1:id"]}");
Console.WriteLine($"studentname:{configRetion["student:1:name"]}");
Console.WriteLine($"studentId:{configRetion["student:2:id"]}");
Console.WriteLine($"studentname:{configRetion["student:2:name"]}");
配置文件文本至C#对象实例的映射
创建一个空的mvc项目,将上一步的json文件 复制到这个项目中,并且改名为appsettings.json(因为Program.cs 中 BuildWebHost方法中,默认将appsettings.json写入配置)。然后我们创建一个类,名字叫做MyClass=>
public class MyClass
{
public string classId { get; set; }
public List<student> student { get; set; }
}
public class student
{
public int id { get; set; }
public string name { get; set; }
}
我们在Startup 中添加一个 IConfiguration,然后再构造函数中注入
public class Startup
{
public IConfiguration configuration { get; set; }
public Startup(IConfiguration Configuration)
{
this.configuration = Configuration;
}
接下来,我们读取配置文件中的内容
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.Run(async (context) =>
{
MyClass myClass = new MyClass();
configuration.Bind(myClass); //这里的Bind方法,将配置文件中的内容绑定到myClass实例
await context.Response.WriteAsync($"classId:{myClass.classId}");
await context.Response.WriteAsync($"studentId:{myClass.student[0].id}");
await context.Response.WriteAsync($"studentname:{myClass.student[0].name}");
await context.Response.WriteAsync($"studentId:{myClass.student[1].id}");
await context.Response.WriteAsync($"studentname:{myClass.student[1].name}");
await context.Response.WriteAsync($"studentId:{myClass.student[2].id}");
await context.Response.WriteAsync($"studentname:{myClass.student[2].name}");
});
}

接下来我们将配置文件读取到MVC的视图中去。首先添加一个Home控制器,在控制器中注入MyClass,代码修改为如下:
public class HomeController : Controller
{
public readonly MyClass _myClass;
public HomeController(IOptions<MyClass> myClass)
{
_myClass = myClass.Value;
}
public IActionResult Index()
{
return View(_myClass);
}
}
修改我们的startup.cs 和添加Index.cshtml,将视图的model设置为MyClass
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MyClass>(configuration); //注册IConfiguration,让控制器中IOptions读到appsettings
services.AddMvc();
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvcWithDefaultRoute();//添加路由中间件
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
@model MVCConfigApplication.MyClass
@{
ViewData["Title"] = "Index";
}
<h2>Index</h2>
<h4>Class Id:@Model.classId</h4>
@foreach(var entity in @Model.student)
{
<ul>
<li>studentId:@entity.id</li>
<li>studentId:@entity.name</li>
</ul>
}
接下来让我们来看一下结果=》

当然,我们也可以不使用控制器,在视图中直接注入MyClass。我们在HomeController中删除依赖注入的代码,修改Index.cshtml代码如下:
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
@using Microsoft.Extensions.Options
@inject IOptions<MVCConfigApplication.MyClass> MyClass @{
ViewData["Title"] = "Index";
} <h2>Index</h2>
<h4>Class Id:@MyClass.Value.classId</h4>
@foreach(var entity in @MyClass.Value.student)
{
<ul>
<li>studentId:@entity.id</li>
<li>studentId:@entity.name</li>
</ul> }
配置文件热更新
将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/
Core篇——初探Core配置管理的更多相关文章
- Core篇——初探Core的认证,授权机制
目录 1.Cookie-based认证的实现 2.Jwt Token 的认证与授权 3.Identity Authentication + EF 的认证 Cookie-based认证的实现 cooki ...
- Core篇——初探Core的Http请求管道&&Middleware
目录: 1.Core 处理HTTP请求流程 2.中间件(Middleware)&&处理流程 3.创建自定义中间件&&模拟Core的请求管道 Core 处理HTTP请求流 ...
- Core篇——初探IdentityServer4(OpenID Connect模式)
Core篇——初探IdentityServer4(OpenID Connect客户端验证) 目录 1.Oauth2协议授权码模式介绍2.IdentityServer4的OpenID Connect客户 ...
- Core篇——初探IdentityServer4(客户端模式,密码模式)
Core篇——初探IdentityServer4(客户端模式,密码模式) 目录 1.Oatuth2协议的客户端模式介绍2.IdentityServer4客户端模式实现3.Oatuth2协议的密码模式介 ...
- Core篇——初探依赖注入
目录 1.DI&&IOC简单介绍 2.UML类图中六种关联关系 3..net core 中DI的使用 4..net core DI初始化源码初窥 DI&&IOC简单介绍 ...
- ASP.NET Core Blazor 初探之 Blazor Server
上周初步对Blazor WebAssembly进行了初步的探索(ASP.NET Core Blazor 初探之 Blazor WebAssembly).这次来看看Blazor Server该怎么玩. ...
- .net core WebAPI 初探及连接MySQL
1. 前言 笔者最近跟着微软官方文档学习.net core WebAPI,但发现其对 WebAPI 连接数据库.读取数据库方面讲得不够细致明了.写此文的目的,即实现 .net core WebAPI ...
- net Core 通过 Ef Core 访问、管理Mysql
net Core 通过 Ef Core 访问.管理Mysql 本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1. ...
- ABP 教程文档 1-1 手把手引进门之 ASP.NET Core & Entity Framework Core(官方教程翻译版 版本3.2.5)
本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 官方文档分四部分 一. 教程文档 二.ABP 框架 三.zero 模块 四.其他(中文翻译资源) 本篇是第一部分的第一篇. 第一部分分三篇 1- ...
随机推荐
- 如何解决Android 5.0以上出现的警告:Service Intent must be expli
有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 5.0一出来后,其中有个特性就是Service Intent must be explitict,也就是说从Lollip ...
- CUDA与OpenCL架构
CUDA与OpenCL架构 目录 CUDA与OpenCL架构 目录 1 GPU的体系结构 1.1 GPU简介 1.2 GPU与CPU的差异 2 CUDA架构 2.1 硬件架构 2.1.1 GPU困境 ...
- Angular 定时器$timeout和$interval关于定时刷新页面和发送请求的用法
项目中有用到定时器定时刷新页面的数据,在网上查看了一些资料,整理了一下,备忘. $timeout 用法如下:$timeout(fn,[delay],[invokeApply]); fn:一个将被延迟执 ...
- (转) RabbitMQ学习之spring整合发送同步消息(注解实现)
http://blog.csdn.net/zhu_tianwei/article/details/40918477 上一篇文章通过xml配置rabbitmq的rabbitTemplate,本节将使用注 ...
- C#获取硬盘序列号
//创建ManagementObjectSearcher对象 ManagementObjectSearcher searcher = new ManagementObjectSearcher(&quo ...
- JQ淡入淡出效果
<script type="text/javascript"> //页面淡入淡出 $(document).ready(function() { $('body').hi ...
- [Libre 6281] 数列分块入门 5 (分块)
水一道入门分块qwq 题面:传送门 开方基本暴力.. 如果某一个区间全部都开成1或0就打上标记全部跳过就行了 因为一个数开上个四五六次就是1了所以复杂度能过233~ code: //By Menteu ...
- 在Tomcat中配置域名:linux下的配置
域名的配置 端口要改成80 找到/usr/tomcat/apache-tomcat-8.5.30/conf的目录,找到server.xml文件,到 <Host name="localh ...
- yii2-dingtalk 钉钉群机器人
说明 群机器人是钉钉群的高级扩展功能.群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步.目前,大部分机器人在添加后,还需要进行Webhook配置,才可正常使用(配置说明详见操作流程中的 ...
- C/C++ 图像二进制存储与读取
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50782792 在深度学习时,制作样本数 ...