文章目录

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配置管理的更多相关文章

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

    目录 1.Cookie-based认证的实现 2.Jwt Token 的认证与授权 3.Identity Authentication + EF 的认证 Cookie-based认证的实现 cooki ...

  2. Core篇——初探Core的Http请求管道&&Middleware

    目录: 1.Core 处理HTTP请求流程 2.中间件(Middleware)&&处理流程 3.创建自定义中间件&&模拟Core的请求管道 Core 处理HTTP请求流 ...

  3. Core篇——初探IdentityServer4(OpenID Connect模式)

    Core篇——初探IdentityServer4(OpenID Connect客户端验证) 目录 1.Oauth2协议授权码模式介绍2.IdentityServer4的OpenID Connect客户 ...

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

    Core篇——初探IdentityServer4(客户端模式,密码模式) 目录 1.Oatuth2协议的客户端模式介绍2.IdentityServer4客户端模式实现3.Oatuth2协议的密码模式介 ...

  5. Core篇——初探依赖注入

    目录 1.DI&&IOC简单介绍 2.UML类图中六种关联关系 3..net core 中DI的使用 4..net core DI初始化源码初窥 DI&&IOC简单介绍 ...

  6. ASP.NET Core Blazor 初探之 Blazor Server

    上周初步对Blazor WebAssembly进行了初步的探索(ASP.NET Core Blazor 初探之 Blazor WebAssembly).这次来看看Blazor Server该怎么玩. ...

  7. .net core WebAPI 初探及连接MySQL

    1. 前言 笔者最近跟着微软官方文档学习.net core WebAPI,但发现其对 WebAPI 连接数据库.读取数据库方面讲得不够细致明了.写此文的目的,即实现 .net core WebAPI ...

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

    net Core 通过 Ef Core 访问.管理Mysql 本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1. ...

  9. ABP 教程文档 1-1 手把手引进门之 ASP.NET Core & Entity Framework Core(官方教程翻译版 版本3.2.5)

    本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 官方文档分四部分 一. 教程文档 二.ABP 框架 三.zero 模块 四.其他(中文翻译资源) 本篇是第一部分的第一篇. 第一部分分三篇 1- ...

随机推荐

  1. 9) 十分钟学会android--使用Fragment建立动态UI

    为了在 Android 上为用户提供动态的.多窗口的交互体验,需要将 UI 组件和 Activity 操作封装成模块进行使用,这样我们就可以在 Activity 中对这些模块进行切入切出操作.可以用  ...

  2. PowerDesigner 逆向工程 Could not Initialize JavaVM!

    原项目的大量的表,使用PowerDesigner 进行逆向工程.提示Could not Initialize JavaVM! 网上找到原因,PowerDesigner 不可以使用64位JDK环境! 有 ...

  3. C#自定义控件实现控件随窗口大小改变

    1.新建用户控件,取名MyForm. 2.将默认的UserControl改成Form 3.在类中添加以下代码 private float X, Y; //获得控件的长度.宽度.位置.字体大小的数据 p ...

  4. WCF - NetCtP 双工错误列表

    1. 在服务 Transfer 实现的协定列表中找不到协定名称 "IMetadataExchange" 将 ServiceMetadataBehavior 添加到配置文件或直接添加 ...

  5. redis启动出错 Creating Server TCP listening socket 127.0.0.1:6379: bind: No error解决办法

    windows下安装Redis第一次启动报错: [2368] 21 Apr 02:57:05.611 # Creating Server TCP listening socket 127.0.0.1: ...

  6. Linux系统编程@进程管理(一)

    课程目标: 构建一个基于主机系统的多客户即时通信/聊天室项目 涉及的理论知识 进程控制:僵尸进程/孤儿进程.进程控制.守护进程... 进程间通信:管道.命名管道.信号... 多线程编程: 锁.信号量. ...

  7. 执行opatch apply 报错 OPatch failed with error code 73

    .执行opatch apply 报错 OPatch failed [oracle@ora_11g 14275605]$ /opt/oracle/product/db_1/OPatch/opatch a ...

  8. 路飞学城Python-Day136

    列举Http请求中常见的请求方式 根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法. HTTP1.1新增了五种请求方法:O ...

  9. kali 安装openvas

    因为Kali Linux上没有默认安装OpenVas,因此只好自己摸索着安装了一遍. 如果没有设置过源(/etc/apt/sources.list),设置如下: deb http://http.kal ...

  10. Project Euler 34 Digit factorials

    题意:判断一个数 N 的各个位数阶乘之和是否为其本身,找出所有符合要求的数然后求和 思路:此题思路跟 30 题相同,找到枚举上界 10 ^ n <= 9! × n ,符合要求的 n < 6 ...