ASP.NET CORE 根据环境变量支持多个 appsettings.json
0.背景
在開發項目的過程當中,生產環境與調試環境的配置肯定是不一樣的。拿個最簡單的例子來說,比如連接字符串這種東西,調試環境肯定是不能連接生產數據庫的。在之前的話,這種情況只能說是你 COPY 兩個同名的配置文件來進行處理。然后你在本地就使用本地的配置,生產環境就使用生產環境的配置文件,十分麻煩。
而 ASP .NET CORE 支持利用環境變量來動態配置 JSON 文件,下面就來看一下吧。
1.準備工作
首先在你的 ASP .NET CORE 項目當中添加一個?appsettings.json?文件,內容如下:
{??"ConnectionString": {
?? ?"Default": "Normal Database"} }
之后再繼續添加一個?appsettings.Development.json,之后在你的解決方案管理器就會看到下面這種情況。
更改其內容如下:
{?"ConnectionString": { ?
? ??"Default": "Development Database"} }
之后呢,我們繼續添加一個生產環境的配置文件,名字叫做?appsettings.Production.json?,更改其內容如下:
{??"ConnectionString": {
?? ? ?"Default": "Production Database"} }
最后我們的文件應該如下圖:
以上就是我們的準備工作,我們準備了兩個環境的配置文件以及一個默認情況的配置文件,下面我就就來看看如何應用環境變量來達到我們想要的效果。
2.環境控制
在項目調試的時候,我們可以通過右鍵項目屬性,跳轉到調試可以看到一個環境變量的設定,通過更改?ASPNETCORE_ENVIRONMENT?的值來切換不同環境。
可以看到目前我們處于?Development?也就是開發環境,那么按照我們的設想,就應該讀取?appsettings.Development.json?的文件數據了。
2.編寫代碼
新建一個?AppConfigure?靜態類,他的內部有一個字典,用于緩存不同環境不同路徑的?IConfigurationRoot?配置。
用法的話也很簡單:
3.測試
測試的話直接更改環境變量就可以看到效果了,更改其值為 Production。
現在我們來運行,并且添加一個監視變量。
看樣子它現在讀取的就是我們的生產環境的數據了。
4.代碼分析
其實吧,也不用這么麻煩,在?Startup.cs?通過構造注入得到的?IConfiguration?就是按照?GetConfigurationRoot()?這個方法來進行構建的,你直接使用?Configuration/ConfigurationRoot?的索引器就可以訪問到與環境變量相應的 JSON 文件了。
可能你還不太理解,明明在?GetConfigurationRoot()?方法里面使用?AddJsonFile()?方法只是添加了兩次個 Provider ,為什么在使用索引器訪問 JSON 配置的時候就是使用的當前環境的 JSON 文件呢?
我其實以為最開始 .NET CORE 對于?IConfiguration?的索引器實現就是讀取了當前環境變量,然后根據這個環境變量去匹配對應的 Provider 取得值。
最后翻閱了 .NET CORE 的源代碼之后發現是我想錯了,其實他就是單純的翻轉了一下 Providers 的集合,然后取的第一個元素。
回到第三節所寫的代碼,可以看到我們首先添加的是?appsettings.json?然后再根據環境變量添加的?$"appsettings.{environmentName}.json"?,所以反轉之后取得的肯定就是帶環境變量的配置文件咯。
回到頂部
5.不同 OS 的環境變量配置
5.1 Windows
直接右鍵計算機手動添加環境變量。
5.2 Linux
使用 export 命令直接進行環境變量設置。
export ASPNETCORE_ENVIRONMEN='Production'5.3 Docker
Docker 配置最為簡單,直接在啟動容器的時候加上?-e?參數即可,例如:
docker run -d -e ASPNETCORE_ENVIRONMEN=Production --name testContainer testImage原文地址:https://www.cnblogs.com/myzony/p/9418858.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的ASP.NET CORE 根据环境变量支持多个 appsettings.json的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Net Core平台灵活简单的日志记录框
- 下一篇: 【项目管理】git和码云的使用