65.9K
CodeProject 正在变化。 阅读更多。
Home

Core 3.1 中的应用程序设置在多环境场景下如何工作

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2021 年 3 月 14 日

CPOL

5分钟阅读

viewsIcon

13236

downloadIcon

113

在企业软件开发中,管理多个环境是非常常见的情况

引言

在企业软件开发过程中,多环境是一个非常常见的情况。.NET Core 3.1 放弃了传统的 Web Config,转而使用 .json 文件,但它不止于此,还为开发人员提供了一种非常灵活的方式来配置应用程序的多个环境。本文探讨了 Core 如何管理这种设置,以及开发人员如何充分利用它。

.NET Core 3.1 支持多个 AppSettings,让我们能够轻松地为不同环境配置应用程序。每个 AppSettings 文件通过 AppSettings.EnvironmentName.json 的约定与其他文件区分开。

下载代码演示

背景

Core 按以下方式组织 AppSettings

  • 一个 AppSettings.json
  • 多个可选的 AppSettings.environment.json

Core 按以下方式管理这些文件:

  • AppSettings.json 文件始终被应用程序考虑使用。
  • 仅选择一个环境文件,具体取决于 .NET 变量:ASPNETCORE_ENVIRONMENT 的值。

所选文件将与通用的 AppSettings.json 合并。合并时,将应用以下规则:

  • 两个文件中的所有值都将添加到最终设置中。
  • 如果某个值同时存在于两个文件中,则环境设置文件中的值具有优先权,并被用于应用程序设置。

应用程序设置示例

让我们来看一个实际的例子。我们有一个 AppSettings.json 文件,其中包含两个条目:

  • environment = default
  • var1 = default

以及一个 AppSettings.dev.json 文件,其中包含以下条目:

  • environment = dev-environment
  • var2 = dev

正如您在下面的图片中所见。

如果 ASPNETCORE_ENVIRONMENT 变量的值为 dev,那么在构建应用程序时,将选择 AppSettings.dev.json 并与其 AppSettings.json 合并,如下所示:

作为此操作的结果,配置变量如下:

  • environment = dev-environment:因为它们同时存在于两个文件中,并且 dev 的值优先于 AppSettings.json
  • var1 = default:因为它存在于 AppSettings.json 中。
  • var2 = dev:因为它存在于 AppSettings.dev.json 中。

Using the Code

下载代码演示

要进行测试,您可以使用本文附加的项目。我将简要解释一下。

该项目是您可以在 Visual Studio(TM) 2019 中找到的 .NET Core 3.1 API 的简单 API 模板,我们对其进行了修改,以更好地展示 AppSettings 的工作原理。

我们在项目中添加了三个额外的 AppSettings 文件,用于在三种不同的环境中进行使用。这在软件开发公司中是很常见的情况。

现在,我们用以下变量配置环境:

AppSettings.json

{
  "environment": "default",
  "var1": "default"
}

AppSettings.dev.json

{
  "environment": "dev-environment",
  "var2": "dev"
}

AppSettings.Development.json

{
  "environment": "Development",
  "var3": "development"
}

AppSettings.prod.json

{
  "environment": "Production",
    "var4": "production"
}

ApplSettings.qa.json

{
  "environment": "QA",
  "var5": "qa"
}

请注意,我们在每个设置文件中都有 `environment` 变量,而 `var1` 到 `var5` 仅存在于其他文件中的一个文件中。

我们在应用程序中创建了一个服务来读取应用程序运行时使用的配置。这使我们能够了解应用程序在运行时实际使用的内容。

       /// <summary>
        /// Get the real value of the settings
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
        public IActionResult Get()
        {
            string env = config["environment"];
            string var1 = config["var1"];
            string var2 = config["var2"];
            string var3 = config["var3"];
            string var4 = config["var4"];
            string var5 = config["var5"];

            string ret = Environment.NewLine;
            return Ok($"Environment: {env}{ret}var1: 
            {var1}{ret}var2: {var2}{ret}var3: {var3}{ret}var4: {var4}{ret}var5: {var5}");
        }

此外,我们还创建了不同的配置文件,允许我们使用不同的 ASPNETCORE_ENVIRONMENT 值来启动应用程序。

"API Prod": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "api/Configuration",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Prod"
      }
    },
    "API Dev": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "api/Configuration",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Dev"
      }
    },
    "API QA": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "api/Configuration",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "QA"
      }
    },

构建应用程序,看看当我们使用 Dev 配置文件启动应用程序时会发生什么。

您应该会看到这个:

Environment: dev-environment
var1: default
var2: dev
var3: 
var4: 
var5: 

请注意,正如我们解释的,`Environment` 变量存在于 AppSettings.jsonAppSettings.dev.json 中,它获取 AppSettings.dev.json 的值,覆盖了 AppSettings.json 中的值。`var1` 仅存在于 AppSettings.json 中,并从中获取值,而 `var2` 仅存在于 AppSettings.dev.json 中,并从中获取值。请注意,`var3`、`var4` 和 `var5` 没有值,因为它们不存在于任何选定的 AppSettings 文件中。

如果我们运行 QA,结果将不同。

Environment: QA
var1: default
var2: 
var3: 
var4: 
var5: qa

您可以继续测试,但这演示了 Core 在构建过程中如何构建最终设置。

关注点

正如我们所见,您放在 AppSettings.json 中的所有变量都应该在所有环境中都使用,除非该变量也存在于 AppSettings.environment.json 文件中。

组织配置的一种方法是将所有默认值放在 AppSettings.json 中,并在其他配置中重复那些每个环境都不同的值。这种组织方式看起来很有吸引力,但在实际生活中我认为会导致问题。

我的建议是将所有配置中相同的 AppSettings.json 值放在这里,并将每个环境中发生变化的值放在 AppSettings.environment.json 中。

这样,如果您忘记添加一个值,就会更容易发现错误,因为没有默认值,服务就会失败,您就有机会纠正它。

如果您默认采用某个值,程序可能仍然可以工作,但使用了一个错误的值,当您部署到供多个开发人员使用的测试环境时,会产生令人困惑的错误。

例如,您可以指向生产环境中的一个 URL,而 QA 环境中的另一个 URL。如果您将 QA 的 URL 放在 AppSettings.json 中,并且忘记在生产环境中添加,程序将默默地采用 QA 值,您将无法知道配置是否正确。

如果没有默认值,您可以防止程序使用错误的配置运行,例如,在健康检查过程中,您可以检测到 URL 不正确。

您可以在此视频中找到更多信息:https://youtu.be/cHgRF3bDKXU

历史

  • 2021 年 3 月 14 日:初始版本
  • 添加视频参考
© . All rights reserved.