3、带你一步一步学习ASP.NET Core中的配置之Configuration
如果你是刚接触ASP.NET Core的学习的话,你会注意到:在ASP.NET Core项目中,看不到.NET Fraemwork时代中的web.config文件和app.config文件了。那么你肯定好奇,现在在ASP.NET Core应用程序中,是通过什么来配置我们的配置信息呢? 下面就跟着我一起来学习了解吧,在ASP.NET Core中是如何配置我们的配置信息,如果读取配置信息的。
在ASP.NET Core 中是使用一个或者多个配置提供程序来配置我们的应用程序的。配置提供程序可以从各种不同的配置源中,读取我们配置的信息,这些配置源有下面这些:
在这篇文章中,我将带领大家学习,如何通过JSON、INI、XML文件来配置、读取我们的配置信息,同样在这里面我还会教大家一种通用的方式,读取配置信息,它就是:使用自定义类来读取配置信息,这种方式叫做选项模式读取配置信息。
首先我们来看看ASP.NET Core中的默认的配置吧,我们新建一个空白的ASP.NET Core应用程序,名字这里我取:MyConfiguration,框架选择当前最新的.net 5.0.
可以看到默认生成了5个文件和一个文件夹properties,分别是:appsettings.json、appsettings.Development.json、Program.cs、Startup.cs,还有一个名字为Properties的文件夹,里面有一个launchSettings.json文件。
我们来先看一看,Program.cs文件:
Program.cs文件中有两个方法,一个是我们熟悉的Main函数,一个是CreateHostBuilder函数。CreateHostBuilder函数为我们创建了主机。然后在Main函数中调用这个CreateHostBuilder方法,也就是程序启动就会创建主机。
CreateHostBuilder为我们的应用程序提供了默认的配置,这些默认的配置的顺序如下:
需要牢牢记在脑海中的是:在上面6个配置提供程序中,后出来的配置,会重写之前的配置。例如:如果我们在appsetting.json以及appsetting.Environment.json文件中,为同一个配置,都设置了值,那么appsetting.Environment.json文件中,设置的这个值将会被使用。使用默认的配置提供程序的顺序,那么命令行配置提供程序将会重写所有在它之前的配置提供程序的配置。
想要连接更多关于CreateHostBuilder方法为我们做了什么,可以看这个微软官方文档:Default builder settings
这篇文章,我的重心就是带领大家学习如果通过文件配置提供程序来配置、读取我们的配置信息,也就是如何从JSON、INI、XML文件中读取配置信息。
从Json文件中读取配置信息
打开appsettings.json文件,添加如下配置信息:
同样在appsetting.Development.json文件中,加上类似的
现在我们要做的就是来读取这些配置信息。
首先空白的模板是没有控制器等文件夹的,我们要做的就是自己一步一步搭建好。
创建好一个Controllers文件夹,在里面新建一个空白的HomeController控制器。在Home控制器中写上如下代码:
Index视图代码:
然后打开Startup.cs文件,需要修改两处:
然后运行程序:
可以看到读取的配置信息是appsetting.Development.json文件中的。这是因为我们应用程序默认的环境就是设置的Development。
默认的JsonConfigurationProvider ,首先是从appsetting.json文件中读取配置,然后appsettings.Environment.json文件中的配置就会加载,然后就会重写了appsettings.json文件中的配置了。
如果我们把ASPNETCORE_ENVIRONMENT改成【Production】,再运行程序,就会发现:读取的是appsetting.json文件中的配置信息了,因为在这里,我们没有appsettings.Production.json文件。所以就会去读取appsettings.json文件。
这种方式,我们在程序运行的时候,修改appetttings.json文件,按回车键,会自动获取最新的配置。例如我们在运行的时候,修改一下appsettings.json文件:
可以看到最新的【不用重新运行,直接刷新网页就能获取最新的配置信息】:
使用选项模式读取应用程序的配置
如果你打算构建大型的应用程序,势必就会有很多的配置信息。或者当你有很多层级的配置信息需要去读取,像上面例子那样,通过Configuration和冒号一个一个的读取方式是不可取的。并且还有机会,因为错误的拼写,导致你读取配置的时候发生异常。推荐读取配置的方式就是使用选项模式。
选项模式使用类,来提供对配置信息进行强类型的读取。废话不多说,我们开干!
新建一个Common文件夹,新建一个类叫做ApplicationOptions,写上这些代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace MyConfiguration.Common
{
public class ApplicationOptions
{
/// <summary>
/// 配置中的MyApplication键值
/// </summary>
public const string MyApplication = "MyApplication";
/// <summary>
/// 配置文件中的Name
/// </summary>
public string Name { get; set; }
/// <summary>
/// 配置文件中的Version
/// </summary>
public string Version { get; set; }
public string DefaultUrl { get; set; }
/// <summary>
/// 配置中的Support子节点
/// </summary>
public SupportOption Support { get; set; }
}
/// <summary>
/// SupportOption
/// </summary>
public class SupportOption
{
public const string Support = "Support";
/// <summary>
/// 配置中的Email
/// </summary>
public string Email { get; set; }
/// <summary>
/// 配置中的Phone
/// </summary>
public string Phone { get; set; }
}
}
我们需要时刻铭记的是:当我们使用选项模式的时候,我们需要创建一个类,定义一些字段和属性来读取配置文件中的信息:
为了绑定我们的配置,我们需要调用ConfigurationBinder.Bind方法,具体做法如下:
然后我们运行程序:
我们直接修改一下appsettings.json文件:
然后刷新页面:
可以看到不用停止程序,直接修改json配置文件,便直接可以读取最新修改的配置信息。
另外上面的代码,我们是通过:IConfiguration.Bind方法绑定的,还可以使用Get方法绑定。
我们可以这样:上面两句代码,可以用下面这一行代替。运行的结果也是一样的。
修改一下appsettings.json文件:
然后刷新一下页面,也获取到了最新修改后的配置信息:
使用依赖注入,注入我们的ApplicationOptions类
在上面所有的例子中,我都是直接在一个标准的控制器中读取我们的配置信息,如果你有一个大型的应用程序,需要在不同的控制器中读取配置信息,我们该怎么做呢?难道在每一个控制器中都写重复的读取配置的代码么?推荐的方式是在Stratup.cs文件中的ConfigureServices方法中,使用依赖注入的方式,注入我们的选项模式的自定义类。请看下面的代码:
运行程序:
修改一下配置文件:刷新页面,发现还是没有变化,没有获取最新的1.3版本和最新的Email信息。
除非重新关闭程序,重新运行程序:才能获取最新的配置信息,所以这种依赖注入的方式,就这点毛病,需要重启一下程序。
使用XML配置提供程序
我们有这样的一个XML文件:
Program类:我们做如下修改
控制器类:
运行程序:读取到了XML中的配置信息。
修改一下XML文件
刷新页面获取到了最新的XML配置:
使用INI配置提供程序
INI文件如下:
Program类中代码:
控制器中代码:
运行程序:读取到了INI文件中的配置信息了。
好了,以上就是ASP.NET Core中如何读取配置信息的内容,后面两种XML和INI读取配置的方式,因为篇幅的原因,就只是粘贴了核心代码,相信大家也能看得懂。希望我的这篇文章能够帮到你 ,如果觉得我写的不错,可以点个赞,帮忙分享,转载,请注明原文链接,谢谢合作。我是灰太狼的梦想,一个自强不息,脚踏实地的程序猿。
3、带你一步一步学习ASP.NET Core中的配置之Configuration的更多相关文章
- ASP.NET Core 学习笔记 第四篇 ASP.NET Core 中的配置
前言 说道配置文件,基本大多数软件为了扩展性.灵活性都会涉及到配置文件,比如之前常见的app.config和web.config.然后再说.NET Core,很多都发生了变化.总体的来说技术在进步,新 ...
- 学习ASP.NET Core Razor 编程系列十三——文件上传功能(一)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列六——数据库初始化
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
C#中的函数式编程:递归与纯函数(二) 在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(上)
学习ASP.NET Core Blazor编程系列一--综述 一.概述 Blazor 是一个生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 U ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(完)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 从明面上学习ASP.NET Core
一.前言 这篇文章就是从能看到地方去学习Core,没有很深奥,也没有很难懂,现在我们开始吧. 二.构建项目,引发思考 创建项目的步骤真的很简单,你要是不会,我真也没法了,我这是创建的M ...
- C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入
C# 嵌入dll 在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...
随机推荐
- SpringBoot常见的异常问题
1. org.mybatis.logging.LoggerFactory Springboot启动报错 Caused by: java.lang.ClassNotFoundException: org ...
- 五. SpringCloud服务降级和熔断
1. Hystrix断路器概述 1.1 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败.这就造成有可能会发生服务雪崩.那么什么是服务雪崩呢 ...
- 在Windows服务中添加定时器
创建windows服务: 在VisualStudio中用C#创建一个Windows服务,微软MSDN参考地址: http://msdn.microsoft.com/zh-cn/library/zt39 ...
- if...else和switch...case
一.位运算 class Demo01 { public static void main(String[] args) { int a = 5; int b = 3; /* 0000 0101 |00 ...
- Java并发编程基础三板斧之Semaphore
引言 最近可以进行个税申报了,还没有申报的同学可以赶紧去试试哦.不过我反正是从上午到下午一直都没有成功的进行申报,一进行申报 就返回"当前访问人数过多,请稍后再试".为什么有些人就 ...
- rest framework Genericview
通用视图 Django的通用视图...被开发为普通使用模式的快捷方式......他们采取某些共同的习惯和模式的发展观和抽象,从而使您可以快速地将数据写入的共同看法,而不必重复自己发现的. - Djan ...
- Codeforces Round #553 B. Dima and a Bad XOR
题面: 传送门 题目描述: 题意很简单:在一个N*M的矩阵中(N行M列),问是否可以:每行选一个整数,使他们的异或和大于0.如果不可以,输出"NIE":如果可以,输出"T ...
- UML类图画法整理
一 类图画法 1.类图的概念 显示出类.接口以及他们的静态结构和关系,用于描述系统的结构化设计. 2.类 类是对一组具有相同属性.操作.关系和语义对象的抽象,是面向对象的核心,包括名称.属性和方法.如 ...
- PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) 凌宸1642
PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) 凌宸1642 题目描述: At the beginning of ever ...
- CodeForces CF877D题解(BFS+STL-set)
解法\(1:\) 正常的\(bfs\)剪枝是\(\Theta(nm4k)\),这个时间复杂度是只加一个\(vis\)记录的剪枝的,只能保证每个点只进队一次,并不能做到其他的减少时间,所以理论上是过不了 ...