问题
如果需要在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的对象,包含Key和Value这两个属性和值。
// 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__Key和Article__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"];
...
}
}