在这篇文章中,我将探讨 .NET 中配置的演变、框架如何处理配置,并提供实际示例来帮助你在应用程序中实现这些概念。
什么是配置?
.NET 中的配置是指控制应用程序行为的设置。这些设置可以包括重试时间、队列长度、功能标志和机密(如连接字符串)等值。传统上,配置是在编译时应用的,但现代 .NET 允许动态运行时配置,从而增强了灵活性和功能。
.NET 配置的演变
从历史上看,.NET Framework(版本 4、4.7、4.8)使用基于 XML 的 WebConfig 文件,通过配置管理器访问。虽然此方法允许键值对配置,但它缺乏对依赖注入的支持,并且具有繁琐的转换语法。
下面是 .NET Framework 中使用的 WebConfig 文件的示例:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="RetryCount" value="5" />
<add key="QueueLength" value="100" />
</appSettings>
<connectionStrings>
<add name="MyDatabase" connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
随着 .NET Core 5、6、7 和现在的 8 的出现,配置系统进行了改进,以支持各种源,如 JSON、XML、环境变量、命令行参数,甚至自定义提供程序。这些源按定义的顺序进行处理,提供统一和动态的配置系统。
appsettings.json中的配置
在 .NET Core 及更高版本中,JSON 通常用于配置。下面是一个文件示例:appsettings.json
{
"AppSettings": {
"RetryCount": 5,
"QueueLength": 100,
"Greeting": "Hello, World!",
"Environment": "Development"
},
"ConnectionStrings": {
"MyDatabase": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
环境变量中的配置
设置以下环境变量
-
名字:AppSettings__Environment
-
价值:Production
命令行参数中的配置
若要在 .NET 应用程序中添加命令行参数,可以在运行应用程序时传递这些参数。下面是一个示例:
dotnet run -- AppSettings:Environment=Staging Logging:LogLevel:Default=Debug
在上面的示例中,并且是传递的命令行参数。AppSettings:EnvironmentLogging:LogLevel:Default
覆盖配置值
添加配置源的顺序决定了哪些值优先于其他值。最后添加的提供程序将具有最高优先级。
例如,假设您按以下顺序添加配置
-
JSON 文件 (appsettings.json)
-
环境变量
-
命令行参数
下面介绍如何使用appsettings.json、环境变量和命令行参数在 .NET Core 应用程序中设置配置。
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.AddCommandLine(args);
IConfiguration configuration = builder.Build();
在此设置中:
-
首先加载 in 中的值。appsettings.json
-
环境变量可以覆盖 中的值。appsettings.json
-
命令行参数可以覆盖环境变量。appsettings.json
示例方案
假设在 .NET 解决方案中,您具有以下配置。您有一个具有以下配置的appsettings.json文件,然后设置环境变量,然后使用步骤 2 中所示的命令运行应用程序
第 1 步 — appsetting.json
{
"AppSettings": {
"Environment": "Development",
"RetryCount": 5
}
}
第 2 步 — 环境变量
-
名字:AppSettings__Environment
-
价值:Production
步骤 3 — 运行应用程序
dotnet run --AppSettings:Environment=Staging --AppSettings:RetryCount=10
当应用程序运行时,最终值将为:
-
AppSettings:Environmentwill be (覆盖环境变量和 from )。StagingProductionDevelopmentappsettings.json
-
AppSettings:RetryCount将是(覆盖 )。105appsettings.json
使用用户密钥进行开发
用户密钥是在开发过程中管理敏感信息的宝贵工具。它们支持安全存储和对机密的访问,而无需将其签入源代码管理。
可以使用以下命令在本地计算机上设置用户密钥。有关在 Windows 环境中设置用户密钥的信息,请参阅此链接。
想象一下,用户密钥、appsettings.json文件、环境变量和命令行参数都使用。评估或读取配置的顺序通常如下:
-
appsettings.json
-
用户密钥
-
环境变量
-
命令行参数
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Configure the order of configuration sources
builder.Configuration
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.AddCommandLine(args);
if (builder.Environment.IsDevelopment())
{
builder.Configuration.AddUserSecrets<Program>();
}
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
在本地开发计算机中设置用户密钥机制后,使用以下命令设置用户密钥。
dotnet user-secrets set "AppSettings:Environment" "Development"
从云提供商的保管库访问机密是一个足够广泛的话题,值得单独撰写博客文章,我将将其留到以后讨论。
IOptions 模式
.NET 中的 IOptions 模式提供了一种可靠的方法来管理配置设置,并支持重新加载和命名选项。有三个主要选项:、 和 。每个都服务于不同的目的和方案,尤其是在需要动态更新或多个配置的应用程序中。IOptionsIOptionsSnapshotIOptionsMonitor
public class AppSettings
{
public string Greeting { get; set; }
public string Environment { get; set; }
}
public class MyService
{
private readonly AppSettings _settings;
public MyService(IOptions<AppSettings> options)
{
_settings = options.Value;
}
public void ShowSettings()
{
Console.WriteLine($"Greeting: {_settings.Greeting}, Environment: {_settings.Environment}");
}
}
.NET 8 引入了配置的编译时验证,从而提高了效率。它支持数据注释和自定义验证逻辑,确保应用程序启动前的配置完整性。
public class AppSettings
{
[Required]
public string Greeting { get; set; }
[Required]
[Url]
public string Environment { get; set; }
}
var appSettings = new AppSettings();
configuration.GetSection("AppSettings").Bind(appSettings);
Validator.ValidateObject(appSettings, new ValidationContext(appSettings), validateAllProperties: true);
有更好或更干净的方法可以在启动时验证配置值,我也会在以后的另一篇博文中保留它。
如果你喜欢我的文章,请给我一个赞!谢谢
标签:Core,AppSettings,配置,最新,Environment,json,appsettings,NET From: https://blog.csdn.net/2401_82584055/article/details/139746448