以前繼續在學習多線程方面的知識,突然這兩天看到博問中有個園友問到如何在.net core類庫中讀取配置文件,當時一下蒙了,這個提的多好,我竟然不知道,因而這兩天瞭解了相關內容纔有此篇博客的出現,正常來說咱們在應用程序目錄下有個appsettings.json文件對於相關配置都會放在這個json文件中,可是要是我創建一個類庫項目,對於一些配置好比密鑰或者其餘須要硬編碼的數據放在JSON文件中,在.net core以前配置文件爲web.config而且有相關的類來讀取節點上的數據,現現在在.net core中爲json文件,那麼咱們該如何作?本文就此應運而生。web
在應用程序目錄下添加JSON文件是進行以下配置:json
var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build();
而後讀取配置文件的節點,以下:多線程
public void ConfigureServices(IServiceCollection services) { services.Configure<BlogViewModel>(Configuration.GetSection("JeffckySettings")); ...... }
可是若是項目是在類庫中呢,固然咱們也能夠將配置值放在應用程序下的appsettings.json中,可是爲了避免讓其json文件中看起來顯得很是臃腫同時在類庫中的配置數據咱們理應放在類庫中來統一管理,因此咱們得另外再想方案,總不能在類庫中創建startup.cs類,再來實例化Configuration吧,這樣想一想應該也是能夠,我沒嘗試過,難道就沒有很簡單的方式麼,難道就不能像.net core以前用類來讀取web.config咱們只須要給出鍵而獲得值嗎?或者說經過強類型配置來統一管理配置數據,這個才應該是咱們嘗試的方向。好了,說了這麼多,咱們就開幹。咱們首先來複習下.net core中是如何獲取應用程序路徑的。app
在.NET 4.X以前獲取當前應用程序根目錄路徑和名稱能夠經過以下獲取ide
var basePath = AppDomain.CurrentDomain.BaseDirectory; var appName = AppDomain.CurrentDomain.ApplicationIdentity.FullName;
固然也能夠經過以下來獲取應用程序根目錄而不是獲得bin目錄學習
Directory.GetCurrentDirectory()
在.net core中獲取bin目錄路徑經過以下來獲取更加簡潔。測試
AppContext.BaseDirectory
在.NET 4.X以前獲取應用程序集名稱經過以下來獲取:ui
Assembly.GetEntryAssembly().GetName().Name;
在.net core中經過以下來獲取:this
var name = typeof(T).GetTypeInfo().Assembly.GetName().Name;
版本經過以下來獲取(.net core也同樣):編碼
Assembly.GetEntryAssembly().GetName().Version.ToString()
在類庫項目中咱們利用強類型配置來實現讀取配文件數據,咱們首先須要下載以下擴展。
在ConfigurationBuilder類中以下一個Add添加方法:
// // 摘要: // Adds a new configuration source. // // 參數: // source: // The configuration source to add. // // 返回結果: // The same Microsoft.Extensions.Configuration.IConfigurationBuilder. public IConfigurationBuilder Add(IConfigurationSource source);
對於 AddJsonFile 擴展方法來添加JSON文件名,文件路徑已經經過 SetBasePath() 方法來實現,一切配置都是基於 IConfigurationBuilder 接口,其中就有一個 JsonConfigurationSource 類,實現以下:
// // 摘要: // Represents a JSON file as an Microsoft.Extensions.Configuration.IConfigurationSource. public class JsonConfigurationSource : FileConfigurationSource { public JsonConfigurationSource(); // // 摘要: // Builds the Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider // for this source. // // 參數: // builder: // The Microsoft.Extensions.Configuration.IConfigurationBuilder. // // 返回結果: // A Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider public override IConfigurationProvider Build(IConfigurationBuilder builder); }
咱們再看其父類就有一個添加JSON文件路徑的方法,以下:
因此咱們從這裏能夠看出添加JSON文件的方法除了經過擴展方法來實現外還有直接實例化JsonConfigurationSource來實現,以下:
IConfiguration config = new ConfigurationBuilder() .SetBasePath(currentClassDir) .AddJsonFile("appsettings.json", false, true) .Add(new JsonConfigurationSource { Path = "appsettings.json", Optional = false, ReloadOnChange = true }) .Build();
上述添加JSON文件皆可,我發現添加JSON文件必須設置JSON文件所在的目錄即必須首先要設置 SetBasePath 方法,不然會報以下錯誤:
咱們搞個測試JSON文件放在當前項目(StudyEFCore.Data)中以下:
最終讀取類庫項目JSON配置文件,將其封裝起來就成了以下這個樣子:
public class JsonConfigurationHelper { public T GetAppSettings<T>(string key) where T : class, new() { var baseDir = AppContext.BaseDirectory; var indexSrc = baseDir.IndexOf("src"); var subToSrc = baseDir.Substring(0, indexSrc); var currentClassDir = subToSrc + "src" + Path.DirectorySeparatorChar + "StutdyEFCore.Data"; IConfiguration config = new ConfigurationBuilder() .SetBasePath(currentClassDir) .Add(new JsonConfigurationSource { Path = "appsettings.json", Optional = false, ReloadOnChange = true }) .Build(); var appconfig = new ServiceCollection() .AddOptions() .Configure<T>(config.GetSection(key)) .BuildServiceProvider() .GetService<IOptions<T>>() .Value; return appconfig; } }
由上有一個還未解決的問題就是如何獲得當前類庫項目的路徑,沒有想到一個好的法子,不知看到此文的你有何高見。簡短的調用則是以下:
var config = new JsonConfigurationHelper(); var person = config.GetAppSettings<Person>("JeffckySettings"); var name = person.Name; var age = person.Age;
結果以下:
咱們將其類修改成 ConfigurationManager ,而後將其 GetAppSettings 方法定義爲靜態方法,最後以下調用是否是知足了在.net core以前讀取web.config中配置數據的問題。哈哈哈:
var person = ConfigurationManager.GetAppSettings<Person>("JeffckySettings");
本節咱們詳細講解了在.net core類庫項目中如何讀取JSON配置中的數據可是仍是有點不足,你有何高見?