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- ...
随机推荐
- 开发手机APP过程,不同使用场景APP搜索框的样式及区别
搜索框是 app 内最常见的控件之一,可以帮助用户快速又精准找到期望的内容与功能.不同的使用场景下,根据页面中搜索的重要程度,搜索框也有着不同的样式. 下面就常州开发APP公司和大家聊聊常见的四种样式 ...
- SqlServer与MySql语法比较
1.复制表(包括表结构.表数据) SqlServer: Select * into user_copy from user MySql: CREATE TABLE user_copy LIKE use ...
- 移动端的0.5px
最近写移动端页面写的比较多,边边基本上都是用的1px,视觉上也确实有点小粗,这不闲下来啦,具体的研究了下0.5px是怎么实现的,切记,这个效果只有在手机上才能看到效果的 利用了css3的缩放效果 &l ...
- IOS Html富文本渲染方式:DTCoreText、WKWebView、UIWebView的内存占用对比
在app的内容页(详情页)中,富文本的显示一直是经常需要处理的问题,而通常在后端的富文本编辑中,Html应用比较普遍,所以其实需要处理的Html富文本显示的问题,以下这三种方式肯定不是最优的显示Htm ...
- apicloud开发方法。
1.前端布局 window frame 子窗口 franmegroup 子窗口组. 一个页面比如有一个固定的顶部,然后中间区域是商品或者是什么内容,那么这个整体就是一个window,那么中间的就是i ...
- 何使用ultraiso软碟通制作u盘启动盘(转载)
现在很多网友都不知道如何用UltraISO软件来制作制作u盘启动盘,那么今天U大师小编就来给大家简单的介绍两种方法,首先第一种方法就是网友要到网上下载一个UltraISO软件,这个网上有很多的 ...
- bzoj 1189: [HNOI2007]紧急疏散evacuate 分层图最大流_拆点_二分
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是 ...
- 路飞学城Python-Day80
36-模板语法之继承 Django模版引擎中最强大也是最复杂的部分就是模版继承了.模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks . ...
- 【深入理解Java虚拟机】自动内存管理机制——垃圾回收机制
Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来.C/C++程序员既拥有每一个对象的所有权,同时也担负着每一个对象生 ...
- [置顶]
HTTP 幂等性概念和应用
转自:http://coolshell.cn/articles/4787.html HTTP 幂等性概念和应用 [ 感谢 Todd 同学 投递本文 ] 基于 HTTP 协议的 Web API 是时下最 ...