首页 > 解决方案 > 从 appsettings.json 访问键值

问题描述

在 .NET 框架中,我通常将键值管道变量存储在 app.config 文件中,并通过执行以下操作来访问这些键值

<configuration>
    <appSettings>
    <add key="BaseURL" value=""/>
    <add key="Env" value=""/>
    <add key="API_KEY" value=""/>
    </appSettings>
</configuration>
 public static class PipelineVariables
    {
        public static string BaseURL => ConfigurationManager.AppSettings["BaseURL"];
        public static string Environment => ConfigurationManager.AppSettings["Env"];
        public static string APIKEY => ConfigurationManager.AppSettings["API_KEY"];
    }

只是为了好玩,我想使用 Visual Studio Code 和 .Net Core 做一个 API 测试自动化项目

我创建了以下 appsettings.json

{
    "AppSettings": {
          "BaseURL": "",
          "Env": "",
          "API_KEY": ""
      }
  }

只是想知道访问这些键值的推荐方法是什么?我将使用这些值作为管道变量,并将其存储在 Azure 中。我想访问键值以传递到我的代码中。

***更新:我的工作方式与我在 .NET Framework 项目中的工作方式相似

我希望能够在这些变量上使用 switch 语句,以便在 Azure 中用于 CI/CD,因此我想要单独的变量方法

但是,如果有一种方法可以简化下面的代码?

      public static string APIKey =>  new ConfigurationBuilder()
                                        .SetBasePath(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName)
                                        .AddJsonFile("appsettings.json", true, true).Build().GetSection("AppSettings:API_KEY")?.Value;

        public static string BaseURL =>  new ConfigurationBuilder()
                                        .SetBasePath(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName)
                                        .AddJsonFile("appsettings.json", true, true).Build().GetSection("AppSettings:BaseURL")?.Value;

标签: c#testing.net-coreautomation

解决方案


这取决于您运行的应用程序类型。您可以通过多种方式解决它。

例如在启动类的 Dotnet Core API 中(这通常已经在 API 或 MVC 项目中自动生成):

public IConfiguration Configuration { get; }

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public void ConfigureServices(IServiceCollection services)
{
    string apiKey = Configuration.GetSection("AppSettings:API_KEY")?.Value;
}

但是您也可以在控制台应用程序或不同类型的项目中运行它:

public void Load()
{
   var builder = new ConfigurationBuilder()
   .SetBasePath(Path.Combine("baseDirectory"))
   .AddJsonFile("appsettings.json", true, true)
   .AddEnvironmentVariables();

   var config = builder.Build();
   string apiKey = config["AppSettings:API_KEY"];
}

添加以下 nuget 包以使上述代码工作:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Binder
  • Microsoft.Extensions.Configuration.EnvironmentVariables
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.Configuration.Json

***更新:也许这可以帮助您简化代码:

public class PipelineVariables
{
    public string BaseURL { get; set; }
    public string Environment { get; set; }
    public string APIKEY { get; set; }

    private static PipelineVariables pipelineVariables;

    public static PipelineVariables Get()
    {
        if (pipelineVariables == null)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(Path.Combine("baseDirectory"))
                .AddJsonFile("appsettings.json", true, true)
                .AddEnvironmentVariables();

            var config = builder.Build();

            pipelineVariables = new PipelineVariables
            {
                APIKEY = config["AppSettings:API_KEY"],
                BaseURL = config["AppSettings:BaseURL"],
                Environment = config["AppSettings:Env"]
            };
        }

        return pipelineVariables;
    }
}

或者更直接的解决方案是以这种方式获取配置类:

    pipelineVariables = config.GetSection(nameof(PipelineVariables)).Get<PipelineVariables>();

只有类中的变量名称需要与 appsettings.json 中的相同

appsettings.json 会变成这样:

{
    "PipelineVariables": {
          "BaseURL": "",
          "Environment": "",
          "APIKEY": ""
      }
}

或者您只需更改 C# 中的属性和类名。

获取设置的示例:

public void RunPipeline() 
{
     PipelineVariables variables = PipelineVariables.Get();
     Console.WriteLine(variables.BaseURL);
}

推荐阅读