目录

介绍

背景

应用程序设置示例

使用代码

AppSettings.json

AppSettings.dev.json

AppSettings.Development.json

AppSettings.prod.json

ApplSettings.qa.json

兴趣点


介绍

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

.NET Core 3.1允许多个AppSetting允许我们在不同环境中轻松配置应用程序。使用AppSettings.EnvironmentName.json 约定区分每个AppSetting文件 。

下载代码演示

背景

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并与AppSetting.json合并,如下所示:

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

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

使用代码

下载代码演示

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

该项目是NET Core 3.1 API的简单API模板,您可以在Visual Studio(TM) 2019中找到它,我们对其进行了修改以最好地展示其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"
}

请注意,我们在每个设置文件中都有变量环境,而在其余的一个文件中只有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值覆盖存在于AppsSettings.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://www.codeproject.com/Articles/5297151/How-Does-the-Application-settings-in-Core-3-1-Work

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

  1. 客户端Blazor中的应用程序设置

    目录 加载客户端应用程序设置 向客户端公开设置 从客户端获取设置 我通过ASP.NET宠坏了,希望应用程式设置能正常工作,但是客户端Blazor还没有一个容易配置的应用程序设置文章.我想要的是能够通过 ...

  2. w7运行里的计算机怎么设置,Win7系统中怎么给程序设置为开机启动项

    Win7系统中怎么给程序设置为开机启动项 腾讯视频/爱奇艺/优酷/外卖 充值4折起 我们在电脑上经常会用到的软件,是可以设置为开机启动项的,这样我们在开机之后,软件就自动运行,就很方便快捷啦.一起看看 ...

  3. 计算机辅助设计在环境工程中的应用,试论计算机辅助设计在环境工程中的应用原稿(范文1)...

    <试论计算机辅助设计在环境工程中的应用(原稿).doc>由会员分享,可免费在线阅读全文,更多与<试论计算机辅助设计在环境工程中的应用(原稿)>相关文档资源请在帮帮文库(www. ...

  4. 计算机辅助设计在环境工程中的应用,试论计算机辅助设计在环境工程中的应用原稿(全文完整版)...

    <试论计算机辅助设计在环境工程中的应用(原稿).doc>由会员分享,可免费在线阅读全文,更多与<试论计算机辅助设计在环境工程中的应用(原稿)>相关文档资源请在帮帮文库(www. ...

  5. linux系统中防止系统时间,设置系统时间与在Linux中

    设置系统时间的GPS timestamp_t结构与GPS在Linux的设置系统时间与在Linux中 timestamp_t结构 大家好, 我想,一旦我得到一个succesfull GPS锁定(写代码A ...

  6. C++中运行一个程序的内存分配情况及qt中的内存管理机制

    一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一 ...

  7. oracle中监听程序当前无法识别连接描述符中请求服务 的解决方法

    早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了"ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务"错误,帮其解决后,发现很多人遇到过这样的问 ...

  8. 怎么用程序设置NVIDIA双显卡环境变量

    现在一般电脑都设置有双显卡,然而有些程序需要跑在独显或者集显等固定显卡上,这就需要更改电脑的设置,设置方法可以参考如下所示: NVIDIA双显卡如何指定程序使用显示设置-百度经验 (baidu.com ...

  9. java中退订程序怎么写_如何在RxJava中的自定义Observable中获得观察者的退订操作的通知...

    订阅者抽象类实际上有一个方法add,可以添加将取消订阅订阅的订阅. def myObservable = Observable.create({ aSubscriber -> val liste ...

最新文章

  1. 模块的使用,包,及程序开发规范
  2. pcap文件解析工具_【免费毕设】PHP网络数据包分析工具的设计与开发(源代码+论文)...
  3. 高级进阶:Azure DevOps搞定.NET Core编译版本号自增
  4. AUTOSAR从入门到精通100讲(四十四)-AUTOSAR 通信服务-PDU Router
  5. myeclipse9 maven web 环境
  6. 【Elasticsearch】在Elasticsearch中查询Term Vectors词条向量信息
  7. 据说IE7.0不支持跨域名脚本,那网页计数器不是要失效啦?
  8. 二维码名片的格式 - vcard(非常好,可直接添加到手机通讯录)
  9. html调用xfplugin,傻瓜式网页里嵌入先锋web万能播放控件
  10. NC63重写导入功能
  11. 经验模态分解(EMD)
  12. Linux查看开机自动运行的服务
  13. 记录一次node.jsV14升级到V16遇到问题并解决
  14. 圆柱体的投影特点_圆柱体三面投影作图方法分析
  15. HUAWEI nova 青春版“大尺度”内存,手机再满都不怕
  16. jack 服务常见错误解决方法
  17. 将N阶矩阵M置成单位阵
  18. ios 关于常用的一些第三方框架的介绍
  19. 软件测试之α测试和Beta测试
  20. 单链表 尾插法 C语言

热门文章

  1. 编程实现将rdd转换为dataframe:源文件内容如下(_第四篇|Spark Streaming编程指南(1)
  2. oracle group by 取最新的一条_大国智能制造全文免费阅读_大国智能制造最新章节_乌溪小道的小说...
  3. python 重写抽象类编译错误_从零开始的Java之旅5.0继承、super、this、抽象类
  4. _java等领域_测试、集成等领域最好的Java工具
  5. python中用于生成数字序列的函数_Python中的生成器?
  6. promise用法_【JavaScript 教程】异步操作——Promise 对象
  7. 彩色人物创意灵感|C4D万物皆可造!
  8. apache缓存php页面不改变,Apache服务器禁止静态文件缓存的实现方法
  9. 大乐透python预测程序_Python生成随机验证码,大乐透号码
  10. win32 destroywindow函数