如何在ASP.NET Core類庫項目中讀取配置文件詳解
前言
最近有朋友問如何在.net core類庫中讀取配置文件,當(dāng)時一下蒙了,這個提的多好,我居然不知道,于是這兩天了解了相關(guān)內(nèi)容才有此篇文章的出現(xiàn),正常來講我們在應(yīng)用程序目錄下有個appsettings.json文件對于相關(guān)配置都會放在這個json文件中,但是要是我建立一個類庫項目,對于一些配置比如密鑰或者其他需要硬編碼的數(shù)據(jù)放在JSON文件中,在.net core之前配置文件為web.config并且有相關(guān)的類來讀取節(jié)點上的數(shù)據(jù),現(xiàn)如今在.net core中為json文件,那么我們該如何做?本文就此應(yīng)運而生。
.NET Core類庫項目讀取JSON配置文件
在應(yīng)用程序目錄下添加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();
然后讀取配置文件的節(jié)點,如下:
public void ConfigureServices(IServiceCollection services) { services.Configure<BlogViewModel>(Configuration.GetSection("JeffckySettings")); ...... }
但是如果項目是在類庫中呢,當(dāng)然我們也可以將配置值放在應(yīng)用程序下的appsettings.json中,但是為了不讓其json文件中看起來顯得非常臃腫同時在類庫中的配置數(shù)據(jù)我們理應(yīng)放在類庫中來統(tǒng)一管理,所以我們得另外再想方案,總不能在類庫中建立startup.cs類,再來實例化Configuration吧,這樣想想應(yīng)該也是可以,我沒嘗試過,難道就沒有很簡單的方式么,難道就不能像.net core之前用類來讀取web.config我們只需要給出鍵而得到值嗎?或者說通過強類型配置來統(tǒng)一管理配置數(shù)據(jù),這個才應(yīng)該是我們嘗試的方向。好了,說了這么多,我們就開干。我們首先來復(fù)習(xí)下.net core中是如何獲取應(yīng)用程序路徑的。
.NET Core獲取應(yīng)用程序路徑
在.NET 4.X之前獲取當(dāng)前應(yīng)用程序根目錄路徑和名稱可以通過如下獲取
var basePath = AppDomain.CurrentDomain.BaseDirectory; var appName = AppDomain.CurrentDomain.ApplicationIdentity.FullName;
當(dāng)然也可以通過如下來獲取應(yīng)用程序根目錄而不是得到bin目錄
Directory.GetCurrentDirectory()
在.net core中獲取bin目錄路徑通過如下來獲取更加簡潔。
AppContext.BaseDirectory
在.NET 4.X之前獲取應(yīng)用程序集名稱通過如下來獲取:
Assembly.GetEntryAssembly().GetName().Name;
在.net core中通過如下來獲?。?/p>
var name = typeof(T).GetTypeInfo().Assembly.GetName().Name;
版本通過如下來獲?。?net core也一樣):
Assembly.GetEntryAssembly().GetName().Version.ToString()
在類庫項目中我們利用強類型配置來實現(xiàn)讀取配文件數(shù)據(jù),我們首先需要下載如下擴展。
在ConfigurationBuilder類中如下一個Add添加方法:
// // 摘要: // Adds a new configuration source. // // 參數(shù): // source: // The configuration source to add. // // 返回結(jié)果: // The same Microsoft.Extensions.Configuration.IConfigurationBuilder. public IConfigurationBuilder Add(IConfigurationSource source);
對于AddJsonFile擴展方法來添加JSON文件名,文件路徑已經(jīng)通過SetBasePath()方法來實現(xiàn),一切配置都是基于IConfigurationBuilder接口,其中就有一個JsonConfigurationSource類,實現(xiàn)如下:
// // 摘要: // 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. // // 參數(shù): // builder: // The Microsoft.Extensions.Configuration.IConfigurationBuilder. // // 返回結(jié)果: // A Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider public override IConfigurationProvider Build(IConfigurationBuilder builder); }
我們再看其父類就有一個添加JSON文件路徑的方法,如下:
所以我們從這里可以看出添加JSON文件的方法除了通過擴展方法來實現(xiàn)外還有直接實例化JsonConfigurationSource來實現(xiàn),如下:
IConfiguration config = new ConfigurationBuilder() .SetBasePath(currentClassDir) .AddJsonFile("appsettings.json", false, true) .Add(new JsonConfigurationSource { Path = "appsettings.json", Optional = false, ReloadOnChange = true }) .Build();
上述添加JSON文件皆可,我發(fā)現(xiàn)添加JSON文件必須設(shè)置JSON文件所在的目錄即必須首先要設(shè)置SetBasePath方法,否則會報如下錯誤:
我們搞個測試JSON文件放在當(dāng)前項目(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; } }
由上有一個還未解決的問題就是如何得到當(dāng)前類庫項目的路徑,沒有想到一個好的法子,不知看到此文的你有何高見。簡短的調(diào)用則是如下:
var config = new JsonConfigurationHelper(); var person = config.GetAppSettings<Person>("JeffckySettings"); var name = person.Name; var age = person.Age;
結(jié)果如下:
我們將其類修改為ConfigurationManager,然后將其GetAppSettings方法定義為靜態(tài)方法,最后如下調(diào)用是不是滿足了在.net core之前讀取web.config中配置數(shù)據(jù)的問題。哈哈哈:
var person = ConfigurationManager.GetAppSettings<Person>("JeffckySettings");
總結(jié)
本節(jié)我們詳細講解了在.net core類庫項目中如何讀取JSON配置中的數(shù)據(jù)但是還是有點不足,你有何高見?
- ASP.NET Core配置文件的獲取和設(shè)置
- ASP.NET?CORE讀取json格式配置文件
- ASP.NET Core讀取配置文件
- ASP.NET Core應(yīng)用程序配置文件AppSetting.json
- ASP.NET Core根據(jù)環(huán)境變量支持多個 appsettings.json配置文件
- ASP.NET Core中修改配置文件后自動加載新配置的方法詳解
- Asp.net Core與類庫讀取配置文件信息的方法
- ASP.NET core Web中使用appsettings.json配置文件的方法
- 詳解ASP.NET Core 在 JSON 文件中配置依賴注入
- 如何使用ASP.NET?Core?配置文件
相關(guān)文章
C#反射技術(shù)的簡單操作(讀取和設(shè)置類的屬性)
反射的作用想必大家都知道了吧,少量屬性的自動化操作手動添加幾下當(dāng)然是沒有問題的,但是屬性數(shù)量較多的時候敲起這些繁鎖的代碼可以困了,再說對擴展和維護性造成很多的不遍,以下代碼中如不能直接使用請?zhí)砑觰sing System.Text;的引用。2011-01-01ASP.NET?MVC5?網(wǎng)站開發(fā)框架模型、數(shù)據(jù)存儲、業(yè)務(wù)邏輯(三)
上次搭建好了項目框架,但還是覺得不太對勁,后來才想起來沒有對開發(fā)目標進行定位,這個小demo雖然不用做需求分析,但是要實現(xiàn)什么效果還得明確。后來想了一下就做個最簡單的網(wǎng)站,目標定為小公司進行展示用的網(wǎng)站。功能有顯示用的文章功能,咨詢留言,評論等2015-09-09Visual Studio ASP.NET Core MVC入門教程第一篇
這篇文章主要為大家詳細介紹了Visual Studio ASP.NET Core MVC入門教程的第一篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03ASP.NET自定義Web服務(wù)器控件之Button控件
這篇文章主要介紹了ASP.NET自定義Web服務(wù)器控件之Button控件,詳細講述了Button控件的實現(xiàn)代碼、前臺頁面的調(diào)用以及對應(yīng)的事件響應(yīng)代碼,具有很好的參考借鑒價值,需要的朋友可以參考下2014-11-11基于.NET的FluentValidation數(shù)據(jù)驗證實現(xiàn)
這篇文章主要介紹了基于.NET的FluentValidation數(shù)據(jù)驗證實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11asp.net中GridView和DataGrid相同列合并實現(xiàn)代碼
asp.net中GridView和DataGrid相同列合并實現(xiàn)代碼,需要的朋友可以參考下2012-10-10