MVC + EFCore 完整教程19-- 最簡方法讀取json配置:自定義configuration讀取配置文件

来源:https://www.cnblogs.com/miro/archive/2019/07/29/11261776.html
-Advertisement-
Play Games

問題引出: ASP.NET Core 預設將 Web.config移除了,將配置文件統一放在了 xxx.json 格式的文件中。 有Web.config時,我們需要讀到配置文件時,一般是這樣的: var value1= ConfigurationManager.ConnectionStrings["... ...


問題引出

ASP.NET Core 預設將 Web.config移除了,將配置文件統一放在了 xxx.json 格式的文件中。

有Web.config時,我們需要讀到配置文件時,一般是這樣的:

var value1= ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

這個ConfigurationManager是在System.Configuration 命名空間下的。

很不幸,預設情況下這個方法也不能用了。

 

如果在Controller需要讀取配置文件,在Startup.cs文件中註冊相關服務,可以類似於註冊context一樣:

// 1、註冊相關服務,類似於如下的XXXContext的例子

services.AddDbContext<XXXContext>(XXX 。。。

 

// 2、controller讀取

然後在具體controller的構造函數中作為參數獲取。

類似於:

private IConfiguration _configuration;

public XXXController(IConfiguration configuration)

{
    _configuration = configuration;
}

 

具體實現方式已有多篇文章講解,請自行搜索,不再贅述。

這種方式引出兩個問題:

1、多數controller是需要讀取context的,但不是每個controller都需要讀取配置文件,這種方式不夠簡潔

2、如果我們需要在controller之外的其他類文件中讀取呢?

 

我們仿照ConfigurationManager讀取Web.config中文件的方式,自定義一個MyConfigurationManager 類。

我直接在上一篇文章中的示常式序添加演示。

 

詳細步驟

步驟一:準備好素材,appsettings.json添加配置項

  "GrandParent_Key": { "Parent_Key": { "Child_Key": "value1" } },

  "Parent_Key": { "Child_Key": "value2" },

  "Child_Key": "value3"

 

 

步驟二:添加 MyConfigurationManager.cs

 

 

    /// <summary>

    /// 獲取自定義的 json 配置文件

    /// </summary>

    static class MyConfigurationManager

    {

        public static IConfiguration AppSetting { get; }

 

        static MyConfigurationManager()

        {

            // 註意:2.2版本的這個路徑不對 會輸出 xxx/IIS Express...類似這種路徑,

            // 等3.0再看有沒其他變化

            string directory = Directory.GetCurrentDirectory();

            AppSetting = new ConfigurationBuilder()

                     .SetBasePath(directory)

                     .AddJsonFile("myAppSettings.json")

                     .Build();

        }

    }

 

 

步驟三:調用

我們去HomeController中添加一個測試方法

public IActionResult ConfigTest()

{

            string value1 = MyConfigurationManager.AppSetting["GrandParent_Key:Parent_Key:Child_Key"];

            string value2 = MyConfigurationManager.AppSetting["Parent_Key:Child_Key"];

            string value3 = MyConfigurationManager.AppSetting["Child_Key"];

            return View();

}

 

加個斷點調試一下,可以看到輸出了想要的結果。

 

總結

通過自定義的Configuration方法可以方便讀取json文件。

獲取配置文件路徑時,AppContext.BaseDirectory在 .net core 2.2和2.1不一樣,

如果事先用的2.2模板,需要右鍵項目,將target framework設為2.1

 

 

P.S. 路徑獲取這塊給出一個通用的方法,這樣2.1和2.2就都滿足了,如下:

var fileName = "appsettings.json";

 

var directory = AppContext.BaseDirectory;

directory = directory.Replace("\\", "/");

 

var filePath = $"{directory}/{fileName}";

if (!File.Exists(filePath))

{

    var length = directory.IndexOf("/bin");

    filePath = $"{directory.Substring(0, length)}/{fileName}";

}

 

 

祝 學習進步 :)

 

P.S. 系列文章列表:https://www.cnblogs.com/miro/p/3777960.html

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.數組: java.lang.ArrayIndexOutOfBoundsException:5 下標越界異常 java.lang.NullPointerException 空指針異常 arr.length獲取數組長度 數組存儲的是多個數,數據的操作離不開迴圈2數組初始化:int[] arr=new ...
  • 一、Gateway 和 Zuul 的區別 Zuul 基於servlet 2.5 (works with 3.x),使用阻塞API。它不支持任何長期的連接,如websocket。 Gateway建立在Spring Framework 5,Project Reactor 和Spring Boot 2 上 ...
  • ReadWriteLock介面 讀寫鎖維護一對關聯鎖,一個只用於讀操作,一個只用於寫操作。讀鎖可以由多個線程同時持有,又稱共用鎖。寫鎖同一時間只能由一個線程持有,又稱互斥鎖。同一時間,兩把鎖不能被不同線程持有。讀寫鎖適合讀取操作多於寫入操作的場景,改進互斥鎖的性能,比如集合的併發安全性改造,緩存組件 ...
  • 1.元組的定義 Tuple (元組)與列表類似,元組的元素 不能修改 元組通常保存 不同類型 的數據 元組用()定義 info_tuple = ("張三", 18, 1.75) 定義 元組名 = (元素1, 元素2, 元素3) 2.元組的創建 空元組 元組名 = () ,很少使用,因為定義後,元組無 ...
  • # 元組。關鍵字:tuple# 定義好了,就不可以修改。只能讀。數據之間全部都是用,隔開。# 定義:()my_tuple = () # 空元組my_tuple2 = ("xj","female",18,170)# 定義方式二my_tuple3 = "hello","python","class17" ...
  • 1.python 中的類 在python中,類也是一個對象,只不過這個對象擁有生成實例的能力,我們一般使用class XXX來定義一個類,在python解釋器執行到這個地方的時候會自動創建出這個對象,python也為我們提供了手動創建類的方法,type()。type()這個方法對我們來說並不陌生,我 ...
  • 表之間的關係 一對一 xx=models.OneToOneField(to='要關聯的表名',to_field='要關聯表名的欄位',on_delete=models.CASCADE) # on_delete 刪除時的一些級聯效果,to_field可以不用寫,預設是關聯到另一張表的主鍵,on_fie ...
  • 1.模塊的概念 模塊 就好比 工具包,要想使用這個工具包中的工具,就需要 導入import 這個模塊 每一個以擴展名 .py 結尾的 Python源代碼文件 都是一個 模塊 在模塊中定義的 全局變數、函數 都是模塊能夠提供給外界直接使用的工具 註: 可以在模塊中定義 變數或者函數 模塊名也是一個標識 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...