最新.NET 8 中的 .NET Core 配置使用方法

在这篇文章中,我将探讨 .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文件、环境变量和命令行参数都使用。评估或读取配置的顺序通常如下:

  1. appsettings.json

  2. 用户密钥

  3. 环境变量

  4. 命令行参数

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);

有更好或更干净的方法可以在启动时验证配置值,我也会在以后的另一篇博文中保留它。

如果你喜欢我的文章,请给我一个赞!谢谢

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值