這篇文章主要給大家介紹了關於如何在ASP.NET Core類庫項目中讀取設定檔的相關資料,這是朋友提的一個問題,文中通過範例程式碼介紹的非常詳解,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧。
前言
最近有朋友問如何在.net core類庫中讀取設定檔,當時一下蒙了,這個提的多好,我居然不知道,於是這兩天瞭解了相關內容才有此篇文章的出現,正常來講我們在應用程式目錄下有個appsettings.json檔案對於相關配置都會放在這個json檔案中,但是要是我建立一個類庫項目,對於一些配置比如密鑰或者其他需要硬式編碼資料放在JSON檔案中,在.net core之前設定檔為web.config並且有相關的類來讀取節點上的資料,現如今在.net core中為json檔案,那麼我們該如何做?本文就此應運而生。
.NET Core類庫項目讀取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中是如何擷取應用程式路徑的。
.NET Core擷取應用程式路徑
在.NET 4.X之前擷取當前應用程式根目錄路徑和名稱可以通過如下擷取
var basePath = AppDomain.CurrentDomain.BaseDirectory;var appName = AppDomain.CurrentDomain.ApplicationIdentity.FullName;
當然也可以通過如下來擷取應用程式根目錄而不是得到bin目錄
Directory.GetCurrentDirectory()
在.net core中擷取bin目錄路徑通過如下來擷取更加簡潔。
AppContext.BaseDirectory
在.NET 4.X之前擷取應用程式集名稱通過如下來擷取:
Assembly.GetEntryAssembly().GetName().Name;
在.net core中通過如下來擷取:
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");
總結