定制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.pswp.cn/news/286932.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286932.shtml
英文地址,請注明出處:http://en.pswp.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;并手動完成相關同…