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事件。其它会话可能正在从数据文件向缓冲区存…

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…

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…

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…

三层体系结构学习总结

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

具有全局观的网络拓扑

近年来&#xff0c;IT技术发展迅速&#xff0c;随着各个企业IT系统的建设&#xff0c;网络架构从单一的局域网扩展到广域网&#xff0c;网络设备也是类型多种多样&#xff0c;路由器、交换机、防火墙、IDS、***等等&#xff0c;而且网络设备的供应厂商也是越来越多&#xff0c;…

硬件_WIFIBlue

WIFI 平台&#xff1a;全志 模组&#xff1a;AP6210 &#xff08;WF BT FM&#xff09; 模式&#xff1a;STA  AP  Wi-Fi Direct&#xff08;点对点&#xff09; 接口&#xff1a;SDIO / USB——WF UART PCM——BT PCM数字音频接口&#xff0c;说明接口传输的音频数…

ActiveX控件的另类免费签名法

注意&#xff1a;一直都有人提到一个问题&#xff0c;就是使用支付宝的证书&#xff0c;会不会有安全问题&#xff0c;这一点是肯定的&#xff0c;所以这个证书只能拿来做软件签名用&#xff0c;不能拿来做支付的。 这几天手上在做一个项目&#xff0c;要用到ActiveX控件&#…

web布局最实用的12条css技巧

1&#xff1a;Rounded corners without images 效果图—— Rounded corners without images<div id”container”> <b class”rtop”> <b class”r1″></b> <b class”r2″></b> <b class”r3″></b> <b class”r4″>&l…

运算符(2)

1.三目运算符 /* 三目运算符/ public class demo1 { public static void main(String[] args) { int score 80; String type score<60?"不及格":"及格"; System.out.println(type); } } 2.运算符优先级逻辑非>逻辑与>逻辑或a||b&&c的运…

虚拟的有时比真实的还要好(+奥运杂谈)

虚拟技术十分热门.虚拟技术是将一台物理硬件计算机虚拟成多台软件计算机.每一台虚拟出来的软件计算机(以下叫做虚拟机)用起来都就象是在用那台被虚拟的硬件计算机(以下叫做真实机)完全一样.当然这样的说法忽略了虚拟机相对于真实机在执行效益上不可避免所存在的损失.所以如何减…

类型转换与键盘输入

1.自动类型装换 自动类型转换指的是容量小的数据类型可以自动装换为容量大的数据类型。如图2-6所示&#xff0c;黑色实线表示的是无数据丢失的 //容量小的可以自动向容量大的转化 //可以将整型常量赋值给byte/short/char等变量&#xff0c;而不需要强制类型转换&#xff0c;只要…

掷骰子游戏和条件语句

1.java掷骰子游戏 public class iftest {public static void main(String[] args) {System.out.println("#####掷骰子游戏#####");System.out.println("#################");//投掷三个色子看看今天手气怎么样&#xff1f;int i (int)(6*Math.random()1);…

加标签的continue用法

1.加标签的continue&#xff0c;类似于C语言的goto语句 转载于:https://www.cnblogs.com/ma1998/p/11444868.html

英国Carmarthen Learning Centre校长Mr Stuart来华访问,与荣新IT培训中心达成教学合作关系...

英国Carmarthen Learning Centre校长Mr Stuart来华访问&#xff0c;与荣新IT培训中心达成教学合作关系 2008年9月4日&#xff0c;英国Carmarthen Learning Centre校长Mr Stuart来华访问。Carmarthen Learning Centre所处于英国伦敦&#xff0c;是一家英国著名的培训学校&#x…

Service Broker实现发布-订阅(Publish-Subscribe)框架

Service Broker实现发布-订阅&#xff08;Publish-Subscribe&#xff09;框架Service Broker 实现一套完整的发布-订阅方案&#xff0c;其中author 发送Service Broker Message&#xff08;又称article&#xff09;到发布者&#xff08;Publisher&#xff09;。发布者负责分发消…

你所应该知道的云计算

感觉像是云计算的一个推崇者&#xff0c;为云计算在做广告&#xff0c;Robyn Peterson的文章What you need to know about cloud computing。 云计算可以保证我们不再受硬件的困扰&#xff0c;真的是这样吗&#xff1f; 在为一个小型商业或者大型企业构建IT结构的时候&#xff…

递归算法

一、递归的核心思想就是自己调用自己&#xff0c;一般来说能够用递归解决的问题应满足3个条件&#xff1a; 1.需要解决的问题可以转化为一个或多个子问题来求解&#xff0c;而这些子问题的求解方法与原问题完全相同&#xff0c;只是在数量和规模上不同。 2.递归调用的次数必须是…