定制ASP.NET 6.0的应用配置

大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。

本文的主题是应用程序配置。要介绍的是如何使用配置、如何自定义配置,以采用不同的方式配置。也许您已经有了现有的XML配置,或者希望在不同的应用上共享YAML配置文件,或者从数据库中读取配置值,总之,配置是我们绕不开的话题。

本文,我们将讨论以下主题:

  • 设置配置文件

  • 使用类型化配置

  • 使用初始化(INI)文件进行配置

  • 配置提供程序

本文中的主题仍然是处在ASP.NET CoreHost层:

27fc5b037ed8ef25e8527eb2edd23c35.png

2.1设置配置文件

让我们从各种配置选项开始,自ASP.NET Core2.0 ,为了确保Startup.cs的干净和简单,配置被隐藏在WebHostBuilder的默认配置中,不再是Startup.cs的一部分。

ASP.NET Core3.1到ASP.NET Core 5.0,代码如下所示:

public class Program {     
public static void Main(string[] args)
{CreateWebHostBuilder(args).Build().Run();     
}     public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{ webBuilder.UseStartup(); }
}

ASP.NET Core 6.0中,为了进一步的简化,Microsoft引入了最小应用程序编程接口(API)方法:去除Startup.cs文件,把所有的配置放在在Program.cs文件中,让我们看看是什么样子:

Var builder = WebApplication.CreateBuilder(args); 
// Add services to the container. 
builder.Services.AddControllersWithViews(); 
var app = builder.Build();

上面两个版本都自带默认配置,也支持自定义配置。我们可以使用ConfigureAppConfiguration()方法扩展了IWebHostBuilder

下面是ASP.NET Core3.1到ASP.NET Core 5.0中的使用最小API方法时的定制代码:

Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>
{         webBuilder.ConfigureAppConfiguration((builderContext,config) =>{             //这里是配置内容     }).UseStartup();     
});

您还可以使用ConfigureAppConfiguration来配置应用程序配置:

builder.WebHost.ConfigureAppConfiguration((builderContext, config) => 
{     //这里是配置内容
});

还有一种更简单的方法,通过访问builderConfiguration属性:

builder.Configuration.AddJsonFile("appsettings.json",optional: false,reloadOnChange: true);

当我们创建ASP.NET Core项目,会生成一些默认的配置文件,比如appsettings.jsonappsettings.Development.json,大多数ASP.NET Core开发人员会使用默认的配置文件来配置。

以下展示了一段用于读取appsettings.json的默认代码:

var env = builder.Environment; 
builder.Configuration.SetBasePath(env.ContentRootPath); 
builder.Configuration.AddJsonFile("appsettings.json",optional: false,reloadOnChange:true); 
builder.Configuration.AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional:true,reloadOnChange:true); 
builder.Configuration.AddEnvironmentVariables();

该配置通过环境变量设置了应用程序的基本路径,这里使用AddEnvironmentVariables()配置方法是一种最佳实践。另外,配置顺序也很重要,后添加的配置将覆盖之前添加的配置,这里的环境变量始终做最后的覆盖。

IConfigurationBuilder有很多扩展方法可以添加更多配置,例如XML或INI配置文件和内存配置,甚至您也可以在社区了找到的其他配置提供程序,以读取YAML文件、数据库值等。

2.2 使用类型化配置

在尝试读取INI文件之前,有必要了解如何使用类型化配置,而不是通过IConfiguration逐键读取配置。要读取类型化配置,需要定义待配置的类型。假设我们创建一个名为AppSettings的类,如下所示:

namespace ConfigureSample; 
public class AppSettings {     public int Foo { get; set; }     public string Bar { get; set; }
}

这是一个简单的POCO类,然后,我们可以在Startup.csConfigureServices方法内填充这些类。直到ASP。NET Core 5.0:

services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

使用迷你API(minimal API)方法,配置如下所示:

builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));

这样,类型化配置也可以在依赖注入(DI)容器中注册为服务,并且可以在应用程序中的任何地方使用。您可以为每个配置创建不同的配置类型。在大多数情况下,一个配置足以应对,但有时为了需要会将配置划分为不同的配置。

下面的代码演示了如何在MVC控制器中使用类型配置:

using Microsoft.Extensions.Options; 
// ... 
public class HomeController : Controller {     private readonly AppSettings _options;     public HomeController(IOptions<AppSettings> options)     {         _options = options.Value;     }     public IActionResult Index()     {         ViewData["Message"] = _options.Bar;         return View();     }
}

IOptionsAppSettings类型的包装器,Value属性包含AppSettings类的实例,包括配置文件中的值。

要读取设置,需要先在appsettings.json文件中配置AppSettings部分,否则值将为null或未设置。现在,让我们将该部分添加到appsettings.json文件,如下所示:

{"Logging": { "LogLevel": { "Default": "Warning" }},"AllowedHosts": "*", "AppSettings": {"Foo": 123,"Bar": "Bar"} 
}

2.3 使用INI文件进行配置

要使用INI文件来配置应用程序,您需要在Program.csConfigureAppConfiguration()方法中添加INI配置,如下所示:

builder.Configuration.AddIniFile("appsettings.ini",optional: false,reloadOnChange: true); 
builder.Configuration.AddJsonFile($"appsettings.{env.EnvironmentName}.ini", optional: true, reloadOnChange: true);

此代码以与JSON配置文件加载方式相同。第一行是必需的配置,第二行是可选的配置,具体取决于当前运行时环境。

INI文件可能如下所示:

[AppSettings] Bar="FooBar"

此文件包含一个名为AppSettings和一个名为Bar的属性。

前面我们说过,配置的顺序很重要。如果通过JSON文件进行配置之后再添加两行有关INI文件的配置,INI文件将覆盖JSON文件中的设置,Bar属性值将被FooBar覆盖。此外,INI文件中的值将通过之前创建的类型化配置提供。

其他所有配置提供程序都将以相同的机制工作。

2.4 配置提供程序

配置提供程序是IConfigurationProvider的实现,它是由配置源创建的(配置源是IConfigurationSource的实现)。配置提供程序从配置源头读取数据,并通过字典对外提供数据。

将自定义或第三方配置提供程序添加到ASP.NET Core中,您需要调用ConfigurationBuilder上的Add方法添加配置源:

// add new configuration source 
builder.Configuration.Add(new MyCustomConfigurationSource { SourceConfig = //配置数据来源     Optional = false,  ReloadOnChange = true 
});

通常,我们会创建一个扩展方法来更优雅地添加配置源,如下所示:

builder.Configuration.AddMyCustomSource("source", optional: false, reloadOnChange: true);

2.4 回顾

其实在大多数情况下,我们不需要添加其他配置提供程序或创建自己的配置提供程序,但是为了以防万一,但最好知道如何定制它。此外,使用类型化配置是读取和提供设置的好方法。在经典的ASP.NET中,我们往往使用手动的方式读取配置,现在,我们只需提供一个类型即可自动完成此操作,因为该类型将通过DI自动实例化。

系列文章:

  • 玩转ASP.NET Core 6.0框架-序言

  • C# 配置日志记录

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

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

相关文章

mysql optimization

EXPLAIN 命令详解 http://www.cnblogs.com/gomysql/p/3720123.html http://www.cnblogs.com/Aiapple/p/5697229.html http://www.cnblogs.com/xuanzhi201111/p/4175635.html https://dev.mysql.com/doc/refman/5.7/en/optimization.html Mysql 执行计划&#xff08;Explain&…

云服务器cpu性能,云服务器cpu性能

云服务器cpu性能 内容精选换一换CPU积分是一种用来衡量云服务器计算、存储以及网络配置利用率的方式。云服务器利用CPU积分机制保证云服务器基准性能&#xff0c;解决超分云服务器长期占用CPU资源的问题。使用CPU积分机制的弹性云服务器适用于平时CPU负载不高、但突发时可接受因…

Flutter之Decoration

1、不废话&#xff0c;先爆照看效果 2、Decoration介绍 Flutter的Decoration可以设置&#xff1a;背景色 背景图 边框 圆角 阴影 渐变色 的等属性&#xff0c;有点像android里面的shape&#xff0c;Decoration 是基类&#xff0c;它的子类有下面这些 BoxDecoration:实现边框、…

DRBD 部署

主备模式DRBD1&#xff1a;eth0&#xff1a;10.0.0.3eth1:172.16.1.3 用于心跳线和数据同步&#xff08;在工作中&#xff0c;一般把心跳线分开&#xff09;DRBD2&#xff1a;eth0&#xff1a;10.0.0.4eth1:172.16.1.4 用于心跳线和数据同步&#xff08;在工作中&#xff0c;一…

.net 服务器端自定义分页控件 简单示例

使用效果如图&#xff1a; 先将控件添加到工具箱 将控件拖入到页面 会自动生成如下代码 <pager:pager ID"Pager1" runat"server" Pagesize"2" OnPageIndexChange"Pager1_PageIndexChange1"> </pager:pager> 后台代码自己…

XenApp_XenDesktop_7.6实战篇之十五:StoreFront的配置

1. StoreFront服务器证书申请 我们将为StoreFront 申请Web 服务器证书&#xff0c;将此证书应用到StoreFront 的IIS 站点上&#xff0c;并将IIS 的443 端口绑定此证书&#xff0c;以使我们从内网可以安全访问StoreFront 站点。也为后续的与NetScaler 集成做好准备。 1.1 在开…

【无人机组装与调试】第四章 F450四轴装机实例-选择机型、需要的器材工具材料

【无人机组装与调试】系列课程全集: 第一章 概述 第二章 关于新西达30A电调说明书的问题 第三章 舵机安装与调整 第四章 F450四轴装机实例-选择机型、需要的器材工具材料 第五章 无人机遥控器 第六章 电调、电池、电机 第四章 F450四轴装机实例-选择机型、需要的器材工具材料…

面向对象类的使用(15)

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

服务器安装红帽系统进入不图形界面,CentOS 安装图形化界面方法

登录系统&#xff0c;使用yum 安装#yum groupinstall X Window System -y安装GNOME桌面环境#yum groupinstall GNOME Desktop Environment -y如果安装KDE桌面环境#yum groupinstall KDE (K Desktop Environment) -y如果发生错误&#xff1a;Warning: Group GNOME Desktop Env…

Mybatis批量更新数据

Mybatis批量更新数据 第一种方式 [html] view plaincopy print?<update id"updateBatch" parameterType"Map"> update aa set a#{fptm}, b#{csoftrain} where c in …

MASA Auth - SSO与Identity设计

AAAAAAAA即认证、授权、审计、账号&#xff08;Authentication、Authorization、Audit、Account&#xff09;。在安全领域我们绕不开的两个问题&#xff1a;授权过程可靠&#xff1a;让第三方程序能够访问所需资源又不泄露用户数据&#xff0c;常用的多方授权协议主要有 OAuth2…

Flutter之ConstrainedBox、SizedBox、UnconstrainedBox(尺寸限制类容器)

1 ConstrainedBox、SizedBox、UnconstrainedBox介绍 1)、ConstrainedBox用于对子组件添加额外的约束。例如&#xff0c;如果你想让子组件的最小高度是80像素 ConstrainedBox({Key key,required this.constraints,Widget child,}) 我们可以看到这里有个constraints final BoxC…

网页用数学公式编辑器 可以集成到FCKeditor

网页用数学公式编辑器 可以集成到FCKeditor 公司有个项目是针对学校的&#xff0c;老师希望能在网页里编辑数学公式&#xff0c;找了很多工具都不行&#xff0c;最后只能自己动手了。用了两天的时间弄出了这个东西&#xff0c;希望对大家有用。本程序可以单独使用&#xff0c;…

【无人机组装与调试】 第五章 无人机遥控器

【无人机组装与调试】系列课程全集: 第一章 概述 第二章 关于新西达30A电调说明书的问题 第三章 舵机安装与调整 第四章 F450四轴装机实例-选择机型、需要的器材工具材料 第五章 无人机遥控器 第六章 电调、电池、电机 一、遥控器的概念 遥控器是一种无线发射装置,通过现代的…

你真的会玩SQL吗?Case也疯狂

你真的会玩SQL吗&#xff1f;系列目录 你真的会玩SQL吗&#xff1f;之逻辑查询处理阶段 你真的会玩SQL吗&#xff1f;和平大使 内连接、外连接 你真的会玩SQL吗&#xff1f;三范式、数据完整性 你真的会玩SQL吗&#xff1f;查询指定节点及其所有父节点的方法 你真的会玩SQL吗&a…

构建iscsi网络存储服务

网络存储概述&#xff1a; 随着企业中数据信息的不断增长&#xff0c;尤其当成百上千TB的数据需要备份、恢复&#xff0c;以及面临着扩容、灾难恢复等需求时&#xff0c;DAS&#xff08;直接附加存储&#xff0c;就是通过与计算机主板的I/O接口&#xff0c;如IDE、SCSI相连接由…

10个python办公黑科技,助你办公效率提高100倍

1946年&#xff0c;世界上第一台通用计算机“ENIAC”在美国宾夕法尼亚大学诞生&#xff1b;“ENIAC”占地170平方米&#xff0c;重达30吨&#xff0c;耗电功率约150千瓦&#xff0c;每秒钟可进行5000次运算&#xff0c;这个庞然大物用于美国国防部进行弹道计算。 在当时&#…

Flutter之Container

1、Container介绍 我们先看它的构造方法 Container({Key key,this.alignment,this.padding, //容器内补白&#xff0c;属于decoration的装饰范围Color color, // 背景色Decoration decoration, // 背景装饰Decoration foregroundDecoration, //前景装饰double width,//容器的宽…

关于jQuery.query.js 取参数的一个小问题

形如&#xff1a;http://localhost:10864/srch.htm?keys&type1 这样的地址&#xff0c;如果我们要取keys的参数&#xff1a; var srchKey $.query.get("keys"); 那么得到的将是‘true’ &#xff0c;而不是空客串&#xff0c;这常常不是我们想要的 。 修正办法…

安卓模拟器获取服务器信息出错,安卓模拟器客户端与服务器不同步

安卓模拟器客户端与服务器不同步 内容精选换一换目前从本地或虚拟机通过DRS备份迁移功能直接迁移到本云RDS for SQL Server实例上&#xff0c;在迁移完成后还需要针对Login账号&#xff0c;DBLink&#xff0c;AgentJOB&#xff0c;关键配置进行识别&#xff0c;并手动完成相关同…