.Net基础系列(二):如何在项目中配置环境变量

162 阅读1分钟

问题

如果需要在C#项目中集中配置系统级别的变量,该如何实现呢?

前置条件

  • 基于donet 6.0创建的C# Demo
  • 主要目录结构如下
DemoApplication
    |---> src
           |---> controller folder
           |---> service folder
           |---> Properties
                   |---> launchSettings.json
           |---> options
                   |---> ArticleOptions.cs
           |---> Program.cs
           |---> appsettings.json
           |---> appsettings.Development.json

方式一: 在appsettings文件中集中定义环境变量

appsettings.Development.json中配置变量。如下,定义一个Article的对象,包含KeyValue这两个属性和值。

// appsettings.Development.json
 "Article": {
    "Key": "this is a test key",
    "Value": "this is a test value"
  }

定义ArticleOptions class, 和配置文件中的结构保持一致

// ArticleOptions.cs
public class ArticleOptions
{
    public string Key { get; set; }
    
    public string Value { get; set; }
}

Program.cs文件中配置,读取appsettings.Development.json的值

// Program.cs
var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<ArticleOptions>(builder.Configuration.GetSection("Article"));

ArticleService.cs中引入ArticleOptions,然后在具体的方法中使用,如_articleOptions.Key

// ArticleService.cs
public class ArticleService : IArticleService
{
    private readonly ArticleOptions _articleOptions;

    public ArticleService(IOptions<ArticleOptions> articleOptions)
    {
        _articleOptions = articleOptions.Value;
    }

    public string doSomething()
    {
        // 使用
        _articleOptions.Key
        ...
    }
}

方式二: 在launchSettings文件中集中定义环境变量

launchSettings.json中配置变量。如下,在environmentVariables下定义Article__KeyArticle__Value属性和值。注意这里要使用下划线。

其余部分与方法一相同

// launchSettings.json
 "environmentVariables": {
    "Article__Key": "this is a test key",
    "Article__Value": "this is a test value"
 }

方式三: appsettings文件 + IConfiguration获取

与方法一类似,不同处在于在ArticleService.cs文件中使用IConfiguration的方式读取变量值

// ArticleService.cs
public class ArticleService : IArticleService
{
    private readonly IConfiguration _configuration;

    public ArticleService(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public string doSomething()
    {
        // 使用
        _configuration["Article:Key"];
        _configuration["Article:Value"];
        ...
    }
}