首页 > 其他分享 >最新.NET 8 中的 .NET Core 配置使用方法

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

时间:2024-06-19 11:28:31浏览次数:25  
标签:Core AppSettings 配置 最新 Environment json appsettings NET

在这篇文章中,我将探讨 .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);

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

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

标签:Core,AppSettings,配置,最新,Environment,json,appsettings,NET
From: https://blog.csdn.net/2401_82584055/article/details/139746448

相关文章

  • C#/.Net 中的多线程介绍和最佳实践
    I/引言计算机中的线程CPU调度程序和时间切片进程和线程并发和并行性异步与多线程在C中使用多线程的好处#II线程C语言#线程生命周期创建、启动和暂停线程加入中止中断线程取消:停止线程的更好方法III/线程问题死锁和争用条件使用Join和LocksAutoRese......
  • .NET C# 八股文 代码阅读(一)
    .NETC#八股文代码阅读(一)目录.NETC#八股文代码阅读(一)1两种获10000个数的方式,哪种效率更高?为什么?2请说出以下代码AB谁先打印,AB打印的值分别为多少?3关于值类型与引用类型、装箱与拆箱,以下代码会输出什么?4关于变量作用域,以下代码会输出什么?1两种获10000个数......
  • 2024 AI大模型 常问的问题以及答案(附最新的AI大模型面试大厂题 )
    前言在2024年AI大模型的面试中,常问的问题以及答案可能会涵盖多个方面,包括AI大模型的基础知识、训练过程、应用、挑战和前沿趋势等。由于我无法直接附上174题的完整面试题库及其答案,我将基于提供的信息和当前AI大模型领域的热点,给出一些常见的问题和答案示例。1.基础知识......
  • 【2024最新精简版】Kafka面试篇
    文章目录Kafka和RabbitMQ什么区别讲一讲Kafka架构你们项目中哪里用到了Kafka?为什么会选择使用Kafka?有什么好处?使用Kafka如何保证消息不丢失?消息的重复消费问题如何解决的?Kafka如何保证消费的顺序性?Kafka的高可用机制有了解过嘛?Kafka实现高性能的设计有了解......
  • 效率提升利器:一个在线的.NET源码查询网站
    前言你是否有这样的苦恼,有时候需要查询.NET中的某个类型、方法、属性或程序集的源代码,但又不想从GitHub中下载源代码。今天大姚分享一个在线且实用的.NET源码查询网站。在线查询地址https://source.dot.net更多.NET在线学习站https://github.com/YSGStudyHards/DotNetGui......
  • 最新Prompt预设词分享,DALL-E3文生图+文档分析
     使用指南直接复制使用可以前往已经添加好Prompt预设的AI系统测试使用(可自定义添加使用)支持GPTsSparkAiSparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型+国内AI全模型。支持GPT-4o大模型、文档分析、识图图片理解、......
  • Asp.net Core依赖注入(Autofac替换IOC容器)
    ASP.NETCoreASP.NETCore(previouslyASP.NET5)改变了以前依赖注入框架集成进ASP.NET的方法.以前,每个功能-MVC,WebAPI,等.-都有它自己的"依赖解析器(dependencyresolver)"机制并且只是'钩子'钩住的方式有些轻微的区别.ASP.NETCore通过Microsoft.Extensions.......
  • YOLOv8独家原创改进173:独家首发最新原创SD_NMS改进点,提升小目标检测精度
    ......
  • 文献总结:ON THE TRAINING AND GENERALIZATION OF DEEP OPERATOR NETWORKS(关于深度算
    ONTHETRAININGANDGENERALIZATIONOFDEEPOPERATORNETWORKS(关于深度算子网络的训练和泛化)remark:相较于之前的文章,这篇更新了两个重要定理的证明!算子网络DeepONet由两个网络构成,即trunk网络和branch网络,通常是同时训练这两个网络,这相当于是在高维空间中解决复杂的优......
  • 最新区块链论文速读--CCF C会议 ICPADS 2023 共28篇 附pdf下载 (3/4)
    Conference:InternationalConferenceonParallelandDistributedSystems(ICPADS)CCFlevel:CCFCCategories:ComputerArchitecture/ParallelandDistributedComputing/StorageSystemsYear:2023Num:28第1~7篇区块链文章请点击此处查看第8~14篇区块链文章请点击......