在.net core中使用配置文件的几个示例和方法
本文基于 .net core 2.2(更新.NET6 示例)
主要包含的示例:
通过DI进行使用配置文件
- 如何在 ASP.NET 中使用配置文件
直接硬编码使用配置文件
- 如何在控制台中使用配置文件
示例:ASP.NET MVC
asp.net mvc已经内部实现了对配置appsettings.json文件的使用,builder默认支持热更新。
使用示例:
假设appsettings.json内容为:
1 | { |
-
新建一个跟appsettings.json结构保持一致的类,如:
1 | namespace webapp.Models |
PS:
需要注意,用于IOptions或者IOptionsSnapshot中的模型的各个属性,其setter必须是公共的,不能是私有。
另外对于该模型,必须要有一个无参构造函数。
-
在Startup.cs中进行依赖注入
1 | public void ConfigureServices(IServiceCollection services) |
-
在controller中调用:
1 | public class TestController : Controller |
-
这里需要注意一点,DI时,如果是单例,则无法使用是IOptionsSnapshot,会报错。
如何覆写默认行为?如取消热更新支持,方法如下:
假设测试controller为
1 | public class TestController : Controller |
Program.cs
1 | public class Program |
-
这个时候,人为将热更新给关闭了,此时更新json文件后,修改后的内容不会更新到系统中。
示例:控制台
对于console项目,默认是没有这个dll的,需要自行从nuget安装
从nuget中安装:Microsoft.AspNetCore.All (注意,末尾不是dll,而是all)
在项目中引入:Microsoft.Extensions.Configuration; 并使用ConfigurationBuilder来构建配置。
使用应用程序参数
在控制台项目属性中增加name和class参数:
使用:
1 | class Program |
使用键值对枚举(这里以字典来说明)
1 | class Program |
注意事项:
-
这里需要注意下,虽然 AddCommandLine 和 AddInMemoryCollection 可以同时调用,但不同的使用次序,效果是不一样的(后一个会覆盖前一个的内容—浅覆盖),如:
1 | /* |
-
另外,需要注意,如果用dotnet命令来执行CommandLineSample.dll,那么“应用程序参数”需要直接跟在命令的后面,如:
- 另外如果AddInMemoryCollection和AddCommandLine同时使用,那么需要将AddCommandLine最后调用,否则一旦被覆盖了,再用dotnet来调用,会没有效果。
1 | dotnet CommandLineSample.dll name=111 class=222 grade="my grade" |
使用JSON文件
-
在项目根目录创建“jsconfig1.json”,同时修改该文件的属性:
- 复制到输出目录:始终复制
- 生成操作:内容
JSON文件内容:
1 | { |
代码:
1 | static void Main(string[] args) |
注册配置文件中的某一个段到一个class模型中
引用上面的json:
1 | { |
如何在注册的时候希望将PersonInfo这个section单独注入到 PersonInfo.cs类中?(以mvc为例)
-
PersonInfo.cs
1 | public class PersonInfo |
-
Startup.cs
1 |
|
-
在controller中使用:
1 | public class TestController : Controller |
-
在 startup.cs中使用
1 | //jwt |
示例:在单元测试中使用 配置文件
首先确保配置文件的属性:
nuget安装、引入必要的库:
1 | Microsoft.Extensions.Configuration |
在构造函数中使用配置文件:
1 | public UnitTest1() |
自定义 ConfigProvider:对数据库连接字符串等敏感信息进行加密
Startup.cs
1 | public Startup(IWebHostEnvironment env) |
AddEncryptedProvider 扩展方法
1 | using Microsoft.Extensions.Configuration; |
CustomConfigProvider.cs
1 | using Microsoft.Extensions.Configuration; |
一个官方例子
https://docs.microsoft.com/zh-cn/aspnet/core/security/app-secrets?view=aspnetcore-2.2&tabs=windows
1 | { |
配置模型:
1 | public class MovieSettings |
.NET 6 下使用 Configuration
JSON 文件:
1 | { |
Program.cs 中设置
1 | using System.Text.Encodings.Web; |
Controller 中调用:
1 | using Microsoft.AspNetCore.Mvc; |
models:
注意事项见注释部分
1 | using Newtonsoft.Json; |
FAQ
-
在使用AddJsonFile的时候,被添加的json文件需要在项目所处根目录内,否则不会加载(路径默认是到项目文件夹,而非bin目录下)。打包发布后会自动从发布文件夹找对应的配置文件
- 这里主要是为了应对新建了一个项目A,然后在这个项目A中添加了一个配置文件config.json,项目B引用这个项目A后,虽然最终编译之后会在bin文件夹内自动生成config.json,但是在调试模式下,默认的路径是在项目路径,而非bin下的文件夹路径,这会导致config.json在开发模式下(调试时)不会被加载。
- 可以手动将改config.json文件复制一份到项目B根目录内。
- 如果是用nuget发布项目A后,项目B再从nuget安装项目A,则不会有此问题。
- 这里主要是为了应对新建了一个项目A,然后在这个项目A中添加了一个配置文件config.json,项目B引用这个项目A后,虽然最终编译之后会在bin文件夹内自动生成config.json,但是在调试模式下,默认的路径是在项目路径,而非bin下的文件夹路径,这会导致config.json在开发模式下(调试时)不会被加载。