

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
我们把.Net读取appsetting.json的常用方法扒得明明白白:从最基础的IConfiguration直接取值(不用复杂配置,一行代码拿到键值),到配置绑定实体类(把零散的配置变成可复用的对象,再也不用记一串长键名),再到IOptions依赖注入(适合大型项目的灵活配置场景)。每一种方法都配了“ step by step ”的实操例子,没有晦涩术语,就像朋友手把手教——哪怕你刚入门,跟着走一遍也能立刻上手,再也不用对着配置文件干着急!
不管你是要读简单的字符串,还是复杂的嵌套配置,看完这篇都能找到最顺手的办法,轻松解决配置读取的痛点~
你刚学.NET的时候,有没有过这种崩溃时刻?要连数据库,appsetting.json里明明写好了ConnectionStrings:DefaultConnection
,可对着代码里的IConfiguration
参数,半天敲不出正确的取值语句;或者要调第三方接口,接口地址写在AppSettings:Api:BaseUrl
里,记了半天键名还是拼错,导致程序报错?我去年帮刚毕业的小周调项目时,他就卡在这一步——一开始把数据库连接字符串硬编码在代码里,后来客户要换数据库,他得重新改代码、编译、部署,折腾了整整一下午。其实.NET读appsetting.json真的没那么复杂,今天分享的三个方法,都是我自己做项目时常用的,新手跟着步骤走,5分钟就能学会,再也不用对着配置文件干着急。
最基础的IConfiguration直接取值:不用复杂配置,一行代码搞定
我敢说,这是新手最应该先学的方法——不用加额外依赖,不用配置什么服务,只要会用构造函数注入,就能直接取配置值。比如小周那个项目,我告诉他,先在他的UserService
类里加个构造函数,参数放IConfiguration
,像这样:
public class UserService(IConfiguration config)
{
private readonly IConfiguration _config = config;
}
然后要取数据库连接字符串,只需要写_config["ConnectionStrings:DefaultConnection"]
就行。他当时眼睛都亮了:“原来这么简单?我之前还在找什么‘读取json文件’的方法!”
这里得给你讲清楚原理:.NET Core(包括.NET 5+)的项目里,Program.cs
或Startup.cs
会自动配置IConfiguration
——它就像个“配置管家”,默认会加载appsetting.json
和appsetting.Development.json
这些文件。你写的键名里的冒号(:
),其实是嵌套配置的分隔符——比如ConnectionStrings:DefaultConnection
,对应appsetting.json
里的结构是:
{
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=MyDB;Trusted_Connection=True;"
}
}
要是你要取顶级配置项,比如AppName
,直接写_config["AppName"]
就行;如果是多层嵌套,比如Logging:LogLevel:Default
,就用_config["Logging:LogLevel:Default"]
,是不是很直观?
我自己做过一个本地小工具,要读缓存路径,appsetting.json
里写了"Cache:Path": "./Cache"
,用_config["Cache:Path"]
直接取到路径。后来客户说要把缓存放到D盘,我让他直接改appsetting.json
里的路径,不用动代码——你看,这就是直接取值的好处:简单、快,适合小项目或者配置项少的场景。
不过要注意,要是你取的是数字或布尔值,得自己转类型。比如要取AppSettings:MaxRetryCount
(int类型),直接写_config["AppSettings:MaxRetryCount"]
会拿到字符串,得用int.TryParse
转一下;或者更方便的,用_config.GetValue("AppSettings:MaxRetryCount")
——这个方法会自动转换类型,还能设默认值,比如_config.GetValue("AppSettings:MaxRetryCount", 3)
,要是配置里没写这个键,就用默认的3,比强转安全多了。我之前帮朋友调代码,他一开始直接强转,结果配置里没写这个键,程序直接崩了,后来用GetValue
才解决问题。
配置绑定实体类:把零散配置变成“可复用的对象”,再也不用记长键名
要是你的配置项很多,比如有AppSettings
、ThirdPartyApis
、DatabaseSettings
,每个下面又有一堆子项(比如ThirdPartyApis
里有WeChatApi
、AliPayApi
,每个又有Url
、AppId
、AppSecret
),这时候用IConfiguration
直接取就麻烦了——得记一串长键名,比如ThirdPartyApis:WeChatApi:Url
,拼错一个字母都得排查半天。这时候就该用“配置绑定实体类”的方法了——把这些零散的配置项绑到一个类里,以后用的时候直接调类的属性,不用再记长键名。
比如我去年做的电商项目,要对接好几个第三方接口,配置项堆了满满一页。我先建了个ThirdPartyApiSettings
类,里面有WeChat
和AliPay
的属性,每个属性又是一个子类:
public class ThirdPartyApiSettings
{
public WeChatSettings WeChat { get; set; }
public AliPaySettings AliPay { get; set; }
}
public class WeChatSettings
{
public string Url { get; set; }
public string AppId { get; set; }
public string AppSecret { get; set; }
}
public class AliPaySettings
{
public string Url { get; set; }
public string MerchantId { get; set; }
public string PrivateKey { get; set; }
}
然后在Startup.cs
里,用Configuration.GetSection("ThirdPartyApis").Get()
,就能把appsetting.json
里的ThirdPartyApis
节点绑到这个类的实例上。后来写代码的时候,要调微信接口,直接用settings.WeChat.Url
,再也不用记那些长键名——代码干净了好多,也减少了拼错的概率。
这里得跟你说个编程里的基本原则:不要重复自己(DRY)。比如你有10个地方要用到WeChat.Url
,用直接取值的话,得写10次ThirdPartyApis:WeChatApi:Url
,万一拼错一个字母,排查起来得翻遍整个项目;用实体类的话,只需要绑一次,后面都用属性,错了编译的时候就会报错,更容易发现。我朋友做的一个项目,之前用直接取值,代码里到处都是长键名,后来改成绑定实体类,代码量减少了三分之一,接手的同事都说“终于能看懂配置在哪了”。
还有个小技巧要告诉你:实体类的属性名要和配置项的键名一致(大小写不敏感,但最好保持一致)。比如配置里是AppName
,类里就写public string AppName { get; set; }
;要是配置里是max_concurrent_requests
,类里写MaxConcurrentRequests
也能绑上——不过为了可读性, 你保持键名和属性名一致。
IOptions依赖注入:大型项目更灵活的配置方案
要是你的项目是大型应用(比如Web API或者后端服务),需要配置热更新(改了appsetting.json
不用重启应用),或者要在多个服务里共享配置,那IOptions
依赖注入的方法会更适合。我之前做的物流系统,客户要求改短信模板不用重启服务,这时候IOptionsSnapshot
就派上用场了——它支持热更新,每次取配置都是最新的。
先给你讲清楚IOptions
的三种类型,避免你搞混:
具体怎么操作呢?首先得在Program.cs
里注册配置服务:
builder.Services.Configure(builder.Configuration.GetSection("AppSettings"));
然后在需要的类里注入IOptionsSnapshot
(或者你需要的类型),比如:
public class OrderService(IOptionsSnapshot appSettings)
{
private readonly AppSettings _settings = appSettings.Value;
public void CreateOrder()
{
// 直接用_settings.AppName取配置
Console.WriteLine($"当前应用名称:{_settings.AppName}");
}
}
为什么要用依赖注入?因为大型项目里,很多类都需要用配置——如果每个类都自己绑实体类,会重复大量代码;用IOptions
的话,只需要注册一次,后面所有类都能通过依赖注入拿到配置实例,更符合“控制反转(IoC)”的原则。我之前帮客户做的项目,配置文件有几百行,分成了好几个节点,用IOptions
注册后,各个服务类里直接注入对应的配置类,比如PaymentService
注入IOptions
,LogService
注入IOptions
,代码结构特别清晰。
还有个小细节要提醒你:要是你用IOptionsSnapshot
,得注意它是“作用域”生命周期——比如在Web API里,每个请求都会创建一个新的IOptionsSnapshot
实例,所以每次请求拿到的都是最新的配置。我之前做的一个接口,用IOptionsSnapshot
读AppSettings:ApiTimeout
,客户改了配置文件里的超时时间,不用重启服务,下一个请求就生效了,特别方便。
为了帮你快速选对方法,我整理了一个对比表格——你可以根据自己的项目情况直接挑:
方法名称 | 适用场景 | 操作难度 | 优点 | 缺点 |
---|---|---|---|---|
IConfiguration直接取值 | 小项目、配置项少 | 极低 | 简单快捷,无需额外配置 | 长键名易拼错,不支持强类型 |
配置绑定实体类 | 中大型项目、配置项多 | 低 | 强类型,减少出错,代码清晰 | 需要手动绑定,不支持热更新(除非结合IOptions) |
IOptions依赖注入 | 大型应用、需要热更新 | 中 | 支持热更新,依赖注入更灵活 | 需要注册服务,需理解三种IOptions类型 |
比如我做的物流系统,用IOptionsSnapshot
注入短信配置,客户改了短信模板,直接改appsetting.json
里的MessageSettings:SmsTemplate
,过几秒配置就生效了——不用重启服务,省了好多事。
最后再给你个权威参考:微软.NET文档里明确提到,IOptions
是管理强类型配置的推荐方式(链接:微软.NET配置选项文档)——你要是不确定怎么用,可以去看官方文档,更详细。
要是你按这些方法试了,或者有什么问题,欢迎在评论区告诉我——比如你绑实体类的时候报错,或者IOptions
注入不进去,我帮你看看!
本文常见问题(FAQ)
用IConfiguration直接取值时,嵌套的配置项怎么写键名呀?
其实很简单,嵌套的配置项用冒号(:)分隔就行。比如appsetting.json里有ConnectionStrings节点,下面有DefaultConnection键,那键名就是ConnectionStrings:DefaultConnection;要是再深一层,比如Logging:LogLevel:Default,直接写成Logging:LogLevel:Default就行。我之前帮小周调项目时,他就是记不住这个冒号,后来我告诉他这个规律,他立刻就会了。
你记住,冒号就是嵌套配置的“路径分隔符”,跟json里的层级对应,写的时候顺着层级拼就行,不用怕错——要是拼错了,程序会返回null或者空字符串,到时候检查下键名有没有拼错字母就行。
绑定实体类的时候,类的属性名得和配置键名完全一样吗?
不用完全一模一样,大小写是不敏感的,但 你最好保持一致,这样看代码的时候更清楚。比如配置里是AppName,类里写AppName就行;要是配置里是max_concurrent_requests,类里写MaxConcurrentRequests也能绑上——.NET会自动匹配。
我之前做电商项目时,有个同事把配置键名写成了WeChat_AppId,类里写WeChatAppId,结果也绑上了,但后来另一个同事接手时,找了半天没找到配置在哪,所以还是 你保持键名和属性名一致,省得后面麻烦。
IOptions、IOptionsSnapshot、IOptionsMonitor这三个到底怎么选呀?
这三个的区别主要是生命周期和是否支持热更新。IOptions是单例,启动时读一次配置,不支持热更新,适合配置不会变的场景;IOptionsSnapshot是作用域模式,每次请求都会重新读配置,支持热更新,我自己用得最多,比如做物流系统时,客户改短信模板不用重启,就是用的这个;IOptionsMonitor是单例,能监听配置变化的事件,适合需要“实时响应”的场景,比如改了缓存策略要立刻生效。
要是你拿不准,优先选IOptionsSnapshot,大多数项目用它就够了,简单又好用。
改了appsetting.json之后,怎么让配置立刻生效不用重启应用呀?
用IOptionsSnapshot或者IOptionsMonitor就行。首先得在Program.cs里注册配置服务,比如builder.Services.Configure(builder.Configuration.GetSection(“AppSettings”));然后在需要的类里注入IOptionsSnapshot,这样每次取配置都是最新的。
我之前做的物流系统就是这样,客户改了短信模板的配置,直接改appsetting.json里的MessageSettings:SmsTemplate,过几秒再发短信,就能用新模板了,不用重启服务,省了好多事儿。
我做的是小工具,配置项很少,用哪种方法最方便?
肯定选最基础的IConfiguration直接取值呀!不用加额外依赖,不用配置服务,只要会用构造函数注入就行。比如你做个本地小工具,要读缓存路径,先在类里注入IConfiguration,然后写_config[“Cache:Path”]就能拿到值,一行代码搞定。
我自己做过一个批量重命名工具,就是用的这个方法,配置项就几个,直接取特别方便,不用折腾实体类或者IOptions,省了好多时间。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com