首頁 >後端開發 >C#.Net教程 >ASP.NET Core類別庫專案中如何實作讀取設定檔的詳解

ASP.NET Core類別庫專案中如何實作讀取設定檔的詳解

黄舟
黄舟原創
2017-10-14 10:01:092874瀏覽

這篇文章主要給大家介紹了關於如何在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");

总结

以上是ASP.NET Core類別庫專案中如何實作讀取設定檔的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn