【问题标题】:Avoid static value in ASP.NET Core Program.cs避免在 ASP.NET Core Program.cs 中使用静态值
【发布时间】:2019-06-04 02:46:20
【问题描述】:

在我的 CreateWebHostBuilder() 方法中,我添加了 AWS Systems Manager Parameter Store 作为 Configuration Builder 的附加源:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args)
    {
        return WebHost.CreateDefaultBuilder(args)
                  .ConfigureAppConfiguration(builder =>
                  {
                      builder.AddSystemsManager("/ConfigureStoreName/");
                  })
                  .UseStartup<Startup>();
    }
}

而不是硬编码 "/ConfigureStoreName/" 我想让它成为一个配置值。

当我调用.ConfigureAppConfiguration() 时,我是否可以访问.CreateDefaultBuilder() 使用的appsettings.json 中的配置值?如果是这样,我将如何更新我的代码来调用它?如果不是,那么避免在 CreateWebHostBuilder() 方法中使用静态值的最佳方法是什么?

【问题讨论】:

  • 您可以拥有另一个包含该信息的设置文件并将其加载到配置中以提取值
  • 我想到了这一点,但我想知道我是否已经可以访问可以调用的名称-值对。但这将是我的后备,创建一个 main-settings.json 文件拉该值。
  • 可能值得考虑使用环境变量。
  • 这是个好主意。刚刚尝试添加它有效。我的步骤,(1)添加到环境变量Visual Studio项目进行调试,然后添加到serverless.template环境变量部分并部署。如果您想将您的建议作为答案,我会将其标记为已解决。

标签: c# asp.net-core .net-core aws-sdk-net


【解决方案1】:

使用该信息预加载设置文件。

如果例如包含设置文件

{
  //...

  "AWS": {
    "Profile": "local-test-profile",
    "Region": "us-west-2",
    "ConfigureSource": {
      "Path": "/ConfigureStoreName/"
    }
  }

  //...
}

将其加载到配置中以提取值。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) {

    var configuration = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json") //<-- or whichever file has that information
        .Build();

    string path = configuration.GetValue<string>("AWS:ConfigureSource:Path");
    //Or a strongly typed model with aws options

    return WebHost.CreateDefaultBuilder(args)
              .ConfigureAppConfiguration(builder =>
              {
                  builder.AddSystemsManager(path);
              })
              .UseStartup<Startup>();
}

【讨论】:

  • 有效的方法,如果我在工作流的这一点上无权访问名称-值配置。
  • 这是一种 catch-22,因为要在构建器上调用 AddSystemsManager,同时您还想在配置中存储/提取所需的值。
  • 没错。我需要有关我正在添加的配置数据的元数据!
  • @Josh 他们在源代码中做了类似的事情来获取 AWSOptions。他们从构建器构建配置,提取所需内容并在构建器稍后在管道中再次构建之前更新构建器。 github.com/aws/aws-dotnet-extensions-configuration/blob/master/…
【解决方案2】:

我最终采用的解决方案是使用环境变量:

public class Program
{
    private static string _parameterStoreNamePath;

    public static void Main(string[] args)
    {
        _parameterStoreNamePath = Environment.GetEnvironmentVariable("AWS_PARAMETER_STORE_NAME");
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args)
    {
        return WebHost.CreateDefaultBuilder(args)
                  .ConfigureAppConfiguration(builder =>
                  {
                      builder.AddSystemsManager(_parameterStoreNamePath); 
                  })
                  .UseStartup<Startup>();
    }
}

注意事项:

  1. 在 Visual Studio 项目中,创建一个名为 AWS_PARAMETER_STORE_NAME 的环境变量。
  2. 对于已部署的实例,AWS_PARAMETER_STORE_NAME 需要在 serverless.template 中设置或通过控制台直接添加到 Lambda。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2021-11-22
    • 2020-07-11
    • 2014-12-19
    • 2013-09-06
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多