NetCore的配置管理(1)

学习NetCore的配置管理;

目录

  1. 命令行配置
  2. Json文件配置
  3. 配置文件文本至C#对象实例的映射
  4. 配置文件热更新
  5. 总结

 命令行配置:

  打开VS2017,新建NetCore控制台项目;

打开nuget包管理;添加Microsoft.Asp.NetCore.all,或者使用命令nstall-Package Microsoft.AspNetCore.All进行添加;接下来添加系统参数;右键项目属性,调试,如下图:

OK,跑一下就行;控制台显示:

Json文件配置:

 接下来学习Json文件配置:新建一个core的控制台项目;同样的通过nuget添加Microsoft>Asp.NetCore.all;添加一个新的json文件,代码如下:

{"ClassNo": "1","ClassDesc": "AspNetCore","Students": [{"name": "Tom","age": "8"},{"name": "jerry","age": "7"},{"name": "rose","age": "18"}]
}

 

using System;
using Microsoft.Extensions.Configuration;
namespace JsonConfigSample
{class Program{static void Main(string[] args){//配置参数var builder = new ConfigurationBuilder().AddJsonFile("Class.json");var configs = builder.Build();Console.WriteLine($"ClassNo:{configs["ClassNo"]}");Console.WriteLine($"ClassDesc:{configs["ClassDesc"]}");Console.WriteLine("Students");Console.Write($":{configs["Students:0:name"]}");Console.WriteLine($":{configs["Students:0:age"]}");Console.Write($":{configs["Students:1:name"]}");Console.WriteLine($":{configs["Students:1:age"]}");Console.Write($":{configs["Students:2:name"]}");Console.WriteLine($":{configs["Students:2:age"]}");Console.ReadLine();}}
}

 最终运行如下图所示:

配置文件文本至C#对象实例的映射:

创建一个空的mvc项目,将上一步的json文件 复制到这个项目中,并且改名为appsettings.json(因为Program.cs 中  BuildWebHost方法中,默认将appsettings.json写入配置)。然后我们创建一个类,名字叫做MyClass;(现在的core2.2或者3.0里面应该是存在appsettings.json)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;namespace OptionsBindSample
{public class Class{public int ClassNo { get; set; }public string ClassDesc { get; set; }public List<Students> Students { get; set; }    }public class Students{public string Name { get; set; }public string Age { get; set; }}
}

 

 

 

 

 

{"ClassNo": "1","ClassDesc": "AspNetCore","Students": [{"name": "Tom","age": "8"},{"name": "jerry","age": "7"},{"name": "rose","age": "18"}]
}

 我们在Startup 中添加一个 IConfiguration,然后再构造函数中注入:

 public class Startup{public IConfiguration Configurations { get; set; }public Startup(IConfiguration configuration){this.Configurations = configuration;}

 接下来,我们读取配置文件中的内容;

 public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.Run(async (context) =>{var myClass = new Class();Configurations.Bind(myClass);await context.Response.WriteAsync($"ClassNo:{myClass.ClassNo}");await context.Response.WriteAsync($"ClassDesc:{myClass.ClassDesc}");await context.Response.WriteAsync($"{myClass.Students.Count}");});}

 

最后启动我们使用core的控制台应用启动即可;

 好的,现在接下来将配置文件读取到MVC的视图中去。首先添加一个Home控制器,在控制器中注入Class,

修改代码如下:

    public class HomeController : Controller{private readonly Class _myClass;public HomeController(IOptions<Class> optionsClass){this._myClass = optionsClass.Value;}public IActionResult Index(){return View(_myClass);}}

 修改我们的startup.cs 和添加Index.cshtml,将视图的model设置为Class;

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;namespace OptionsBindSample
{public class Startup{public IConfiguration Configurations { get; set; }public Startup(IConfiguration configuration){this.Configurations = configuration;}// This method gets called by the runtime. Use this method to add services to the container.// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940public void ConfigureServices(IServiceCollection services){services.Configure<Class>(Configurations);//添加MVC,依赖注入配置加到里面;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();//使用默认路由}}
}

 

@model MVCConfigApplication.Class@{ViewData["Title"] = "Index";
}<h2>Index</h2><h4>Class.No:@Model.ClassNo</h4><h4>Class.Desc:@Model.ClassDesc</h4><h3>Students:</h3><div>@foreach (var itemStudent in Model.Students){<span>@itemStudent.Name</span><span>@itemStudent.Age</span>}</div>

 

当然,我们也可以不使用控制器,在视图中直接注入MyClass。我们在HomeController中删除依赖注入的代码,修改Index.cshtml代码如下

  

public class HomeController : Controller{public IActionResult Index(){return View();}}
@using Microsoft.Extensions.Options
@inject IOptions<OptionsBindSample.Class> ClassAccesser;@{
ViewData["Title"] = "Index";
}<h1>index</h1>
<h4>Class.No:@ClassAccesser.Value.ClassNo</h4>
<h4>Class.Desc:@ClassAccesser.Value.ClassDesc</h4>
<h3>Students:
</h3>
<div>@foreach (var itemStudent in ClassAccesser.Value.Students){<span> Name:@itemStudent.Name</span><span>Age:@itemStudent.Age</span>}
</div>

 配置文件热更新

   将IOptions 改为IOptionsSnapshot:

 在asp.net core 中,WebHost.CreateDefaultBuilder(args)  方法中,默认加载appsettings.json文件,并且将是否更改重新加载设置为true;

F12进去阅读下源代码,可以看到这三个参数;或者去GitHub上面可查看Core的源代码;

这里是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",把对应的值读取出来;

 

转载于:https://www.cnblogs.com/Arainzhe/p/11380631.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

buffer busy waits

buffer busy waitshttp://metalink.oracle.com/metalink/plsql/ml2_documents.showDocument?p_database_idNOT&p_id34405.1当会话想要访问缓冲存储器中的数据块&#xff0c;而该数据块正在被其它会话使用时产生buffer busywaits事件。其它会话可能正在从数据文件向缓冲区存…

推荐几个EDA网站

http://www.cnblogs.com/jianyungsun/archive/2011/05/12/2044898.html 1. OPENCORES.ORG 这里提供非常多&#xff0c;非常好的PLD了内核&#xff0c;8051内核就可以在里面找到。 进入后&#xff0c;选择project或者由http//www.opencores.org/browse.cgi/by_category进入。 h…

SetupFactory安装制作心得

很多年前&#xff0c;因为仰慕Install Shield的鼎鼎大名&#xff0c;所以很是花了些功夫研究了一番&#xff0c;最后&#xff0c;基本上也可以打出很完善的包了&#xff0c;其中也不乏一些很有难度的事情&#xff0c;比如ODBC的打包等。但它实在太难用了&#xff0c;过上一段时…

Timus 1114. Boxes

Timus 1114. Boxes 要求计算出将两种颜色的球放到盒子中的各种组合的数目。1114. Boxes Time Limit: 0.6 second Memory Limit: 16 MB N boxes are lined up in a sequence (1 ≤ N ≤ 20). You have A red balls and B blue balls (0 ≤ A ≤ 15, 0 ≤ B ≤ 15). The red bal…

写作知识点

1.逻辑框架 2.起承转合 3.写作套路 4.述说,正述,倒序, 先说结果,分析原因,解决方案,,方案检查,紧急预案,预期结果 转载于:https://www.cnblogs.com/zeenzhou/p/11388739.html

Speerio Skinergy 'Image' is ambiguous 错误

使用BeyondCSS皮肤时报错&#xff1a;Could Not Load Skin: /Portals/0/Skins/beyondcss/1column_speerio.ascx Error: E:"Development"DotNetNuke"InstallArea"DotNetNuke_04.08.03_Source"Website"controls"Speerio"Skinergy"s…

Sql Server中自动序号的方法

第一种:使用identity函数增加临时表的方法 selectid identity(int,1,1),*into#tmp fromtableselect*from#tmp droptable#tmp 在SQL2005中新增了ROW_NUMBER()函数,给我们带来了很多方便,使用方法如下: SELECTid,ROW_NUMBER() OVER(orderbyid)asRowNumber FROMTable有一个方便,as…

js- 对象 toString 的结果 [ object Object ]

alert({ }); 输出 [ object Object ] 除了null和undefined之外&#xff0c;其他的类型(数值、布尔、字符串、对象)都有toString()方法&#xff0c;它返回相应值的字符串表现(并不修改原变量)。每个对象都有一个toString()方法。当该对象被表示为一个文本值时&#xff0c;或者一…

flex白板之图形绘制函数

图形的绘制 Graphics类提供了相关的方法&#xff1a; 1&#xff0c;清空画布 graphics.clear();2&#xff0c;设置画笔 graphics.lineStyle(thickness:Number NaN, color:uint 0, alpha:Number 1.0, pixelHinting:Boolean false, scaleMode:String "normal", ca…

程序员的工具箱奇形怪状

Snipaste 有道词典window客户端 转载于:https://www.cnblogs.com/ww01/p/11393340.html

请汇编高手注释的CompareText

这段代码是将两个字符串对象进行比较&#xff0c;忽略大小写&#xff0c;两个字符串缓冲区地址利用EAX和EDX两个寄存器传给该函数&#xff0c;字符串的长度用4个字节保存在缓冲区的前面&#xff0c;函数用EAX返回比较结果&#xff0c;结果为0表示相同。function CompareText(co…

俱乐部又多了一个MVP

山西DotNet俱乐部的周金桥同志成为2008年7月份的MVP&#xff0c;在这里祝贺一下。

交朋友的学问

交朋友这个事情是这样的&#xff0c; 咱们自己确实得努力&#xff0c; 否则有点水平的就不会倾向于和咱们建立关系。 不是别人骄傲&#xff0c; 而是如果交一大堆朋友&#xff0c; 用于交流的时间又有限&#xff0c; 到时候反而不知如何处理&#xff0c;得罪哪一个也行不是。过…

MathCAD求解方程组

用MathCAD解方程组&#xff0c;经常因为的原因出错&#xff0c;所以留在这里自己看&#xff0c;也供大家参考。 转自&#xff1a;http://www.cscce.net/fsp/reeducation/mathcad.html (九) 解方程与方程组 1&#xff0e;解一元一次方程 root函数格式&#xff1a;root(f(x),x…

计算机启动过程详解

打开电源启动机器几乎是电脑爱好者每天必做的事情&#xff0c;面对屏幕上出现的一幅幅启动画面&#xff0c;我们一点儿也不会感到陌生&#xff0c;但是&#xff0c;计算机在显示这些启动画面时都做了些什么工作呢&#xff1f;相信有的朋友还不是很清楚&#xff0c;本文就来介绍…

extern C

extern "C" LuChenQun edited this page Mar 30, 2019 3 revisions在C中常在头文件见到extern "C"修饰函数&#xff0c;那有什么作用呢&#xff1f; 是用于C链接在C语言模块中定义的函数。 C虽然兼容C&#xff0c;但C文件中函数编译后生成的符号与C语言生…

病毒与恶意程序

仅仅在几年前&#xff0c;我们还可以清晰地辩明哪些软件是具有恶意的而哪些软件是无害的&#xff0c;然而在今天&#xff0c;病毒无论在种类还是数量上都呈现出爆炸性的增长&#xff0c;甚至有大量的非授权软件已经超过了病毒的意义范畴&#xff0c;恶意程序已经形成了一个大的…

三层体系结构学习总结

三层架构学习总结KeyWords: 三层体系结构,DAL,BLL,USL,学习心得,三层体系结构,软件三层体系结构 By Flouse2008年7月24日三层体系结构的概念 用户界面表示层(USL)业务逻辑层(BLL)数据访问层(DAL) 图一&#xff1a;BLL将USL与DAL隔开了&#xff0c;并且加入了业务规则 各层的作用…

面向对象(1)

1.对象的比较 和equals: &#xff1a;比较两个变量的值是否相等。 比较两个引用类型的内存地址是否相等&#xff0c;即是否指向同一对象。eqeal()&#xff1a;比较两对象内容是否一致 2.抽象类 抽象类是一种模板模式&#xff0c;为所有子类提供了一个通用模板&#xff0c;子类…

改变人生的几句话

第一句话是&#xff1a;优秀是一种习惯。 这句话是古希腊哲学家亚里士多德说的。如果说优秀是一种习惯&#xff0c;那么懒惰也是一种习惯。人出生的时候&#xff0c;除了脾气会因为天性而有所不同&#xff0c;其他的东西基本都是后天形成的&#xff0c;是家庭影响和教育的结果…