C#讀取appsettings.json配置的常用方法
本文檔介紹了在 C# 項(xiàng)目中讀取 appsettings.json 文件的常用方法,涵蓋了現(xiàn)代 .NET 的依賴注入(DI)模式以及適用于非 DI 環(huán)境的靜態(tài)讀取模式,并詳細(xì)說明了不同數(shù)據(jù)類型的讀取方式及常見踩坑點(diǎn)。
示例配置文件準(zhǔn)備
在開始之前,在項(xiàng)目根目錄創(chuàng)建一個(gè) appsettings.json 文件,內(nèi)容如下:
{
"AppName": "MyAwesomeApp",
"MaxUsers": 100,
"SupportedLanguages": [ "zh-CN", "en-US", "ja-JP" ],
"Database": {
"Host": "127.0.0.1",
"Port": 3306
}
}
極其重要的第一步:
在 Visual Studio 中,右鍵點(diǎn)擊 appsettings.json -> 屬性 -> 將 “復(fù)制到輸出目錄” (Copy to Output Directory) 設(shè)置為 “如果較新則復(fù)制” (Copy if newer) 。否則程序運(yùn)行時(shí)會(huì)報(bào)找不到文件的錯(cuò)誤!
模式一:依賴注入模式(推薦)
適用于 ASP.NET Core、Worker Service 等自帶依賴注入容器的現(xiàn)代 .NET 項(xiàng)目。推薦使用強(qiáng)類型綁定(Options Pattern)。
1. 定義映射類
public class DatabaseOptions
{
public string Host { get; set; }
public int Port { get; set; }
}
2. 注冊(cè)配置 (Program.cs)
var builder = WebApplication.CreateBuilder(args);
// 將 JSON 中的 "Database" 節(jié)點(diǎn)綁定到 DatabaseOptions 類
builder.Services.Configure<DatabaseOptions>(builder.Configuration.GetSection("Database"));
3. 在服務(wù)中注入并使用
public class MyService
{
private readonly DatabaseOptions _dbOptions;
// 使用 IOptions<T> 注入
public MyService(IOptions<DatabaseOptions> options)
{
_dbOptions = options.Value;
}
public void Connect()
{
Console.WriteLine($"Connecting to {_dbOptions.Host}:{_dbOptions.Port}");
}
}
模式二:靜態(tài)工具類模式(隨時(shí)隨地讀取)
適用于控制臺(tái)應(yīng)用、WinForms/WPF,或者你想在任意靜態(tài)方法中直接讀取配置的場(chǎng)景。
前置準(zhǔn)備: 通過 NuGet 安裝以下包:
Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.JsonMicrosoft.Extensions.Configuration.Binder
1. 創(chuàng)建靜態(tài)配置助手類
使用靜態(tài)構(gòu)造函數(shù)確保配置只被加載一次:
using Microsoft.Extensions.Configuration;
using System.IO;
public static class ConfigHelper
{
public static IConfiguration Configuration { get; }
static ConfigHelper()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
Configuration = builder.Build();
}
}
2. 按數(shù)據(jù)類型讀取示例
以下代碼演示了如何使用 ConfigHelper 讀取不同類別的數(shù)據(jù):
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
public class ConfigDemo
{
public static void Run()
{
// ----------------------------------------------------
// 1. 讀取基本類型 (String, Int, Bool 等)
// 使用 GetValue<T> 可以在找不到配置時(shí)提供一個(gè) fallback (默認(rèn)值)
// ----------------------------------------------------
string appName = ConfigHelper.Configuration.GetValue<string>("AppName", "DefaultApp");
int maxUsers = ConfigHelper.Configuration.GetValue<int>("MaxUsers", 50);
Console.WriteLine($"App: {appName}, Max Users: {maxUsers}");
// ----------------------------------------------------
// 2. 讀取列表 (List / Array)
// 需先 GetSection() 獲取節(jié)點(diǎn),再 Get<T>() 綁定
// ----------------------------------------------------
var languages = ConfigHelper.Configuration.GetSection("SupportedLanguages").Get<List<string>>();
if (languages != null)
{
Console.WriteLine("Languages: " + string.Join(", ", languages));
}
// ----------------------------------------------------
// 3. 讀取對(duì)象 (Object)
// 同樣先獲取節(jié)點(diǎn),再綁定到 C# 實(shí)體類
// ----------------------------------------------------
var dbConfig = ConfigHelper.Configuration.GetSection("Database").Get<DatabaseOptions>();
if (dbConfig != null)
{
Console.WriteLine($"DB Port: {dbConfig.Port}");
}
}
}
常見異常與排錯(cuò)指南 (Troubleshooting)
在讀取配置文件時(shí),經(jīng)常會(huì)遇到以下兩種邊緣情況,請(qǐng)務(wù)必在代碼中做好防御性編程:
1. 鍵不存在或值為空 (Null)
現(xiàn)象: 不會(huì)報(bào)錯(cuò)拋出異常。
表現(xiàn):
- 使用
GetValue<T>()時(shí),如果沒有提供默認(rèn)值,會(huì)返回類型T的默認(rèn)值(如int變?yōu)?0,bool變?yōu)?false)。 - 使用
.Get<List<T>>()或.Get<Object>()時(shí),如果節(jié)點(diǎn)不存在,會(huì)返回null。
應(yīng)對(duì)方案: 對(duì)于對(duì)象和列表,使用前必須進(jìn)行判空校驗(yàn) (if (obj != null)) ,或者在 C# 類定義時(shí)初始化為空列表(例如 public List<string> Langs { get; set; } = new();)。
2. 數(shù)據(jù)類型不匹配
現(xiàn)象: 會(huì)拋出 System.InvalidOperationException 異常。
表現(xiàn): 比如 JSON 中寫的是 "MaxUsers": "一百",但你試圖用 GetValue<int>("MaxUsers") 讀取。底層轉(zhuǎn)換器無法將 "一百" 解析為整型,程序?qū)⒈罎ⅰ?/p>
應(yīng)對(duì)方案: * 嚴(yán)格規(guī)范 JSON 的數(shù)據(jù)類型(數(shù)字不要加雙引號(hào),保持為純數(shù)字)。
對(duì)于高度不可信的外部配置,建議先讀取為 string,然后使用 int.TryParse() 進(jìn)行安全轉(zhuǎn)換:
string rawValue = ConfigHelper.Configuration["MaxUsers"];
if (int.TryParse(rawValue, out int safeMaxUsers)) {
// 解析成功,使用 safeMaxUsers
} else {
// 解析失敗,使用默認(rèn)邏輯
}
到此這篇關(guān)于C#讀取appsettings.json配置的常用方法的文章就介紹到這了,更多相關(guān)C#讀取appsettings.json配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#高效實(shí)現(xiàn)凍結(jié)Excel行和列的完整代碼
凍結(jié)行和列可以確保重要數(shù)據(jù)(如標(biāo)題)在你瀏覽工作表時(shí)始終可見,此功能在處理大型數(shù)據(jù)集時(shí)非常有用,下面我們就來看看如何使用 C# 來凍結(jié) Excel 中的行和列吧2025-12-12
C#調(diào)用執(zhí)行命令行窗口(CMD)的方法與技巧
在 C# 的編程世界里,我們常常會(huì)遇到需要與操作系統(tǒng)底層進(jìn)行交互的場(chǎng)景,這時(shí),調(diào)用命令行窗口(CMD)就成為了一個(gè)強(qiáng)大的工具,通過 C# 調(diào)用 CMD 都能為我們提供極大的便利,極大地拓展了 C# 應(yīng)用程序的功能邊界,本文介紹了C#中調(diào)用執(zhí)行CMD的方法與技巧2025-01-01
C# 中的IComparable和IComparer的使用及區(qū)別
這篇文章主要介紹了C# 中的IComparable和IComparer的使用及區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
淺談C#9.0新特性之參數(shù)非空檢查簡(jiǎn)化
這篇文章主要介紹了淺談C#9.0新特性之參數(shù)非空檢查簡(jiǎn)化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
C#實(shí)現(xiàn)注冊(cè)碼注冊(cè)機(jī)制效果詳解
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)注冊(cè)碼注冊(cè)機(jī)制效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01
基于C#實(shí)現(xiàn)的仿windows左側(cè)伸縮菜單效果
這篇文章主要介紹了基于C#實(shí)現(xiàn)的仿windows左側(cè)伸縮菜單效果,比較實(shí)用的功能,需要的朋友可以參考下2014-08-08

