Asp.net Core 和類庫讀取配置檔案資訊
看乾貨請移步至.net core 讀取配置檔案公共類
首先開一個腦洞,Asp.net core 被使用這麼長時間了,但是關於配置檔案(json)的讀取,微軟官方似乎並沒有給出像.net framework讀取web.config那樣簡單且完美。嚴重懷疑這是微軟為了促進.net core 生態繁榮搞的一點小手段。
appsetting.Development.json (appsetting.json的內容和這個差不多,下面會講到多環境使用)
{
"SettingPath": {
"VideoFilePath": "C:\Users\89275\Desktop\Projects\mv",
"FfmpegPath": "C:/Users/89275/Desktop/Projects/mv/ffmpeg.exe",
"FtpPath": "http://192.168.254.1/videofile",
"VirtualPath": "/videoplay"
},
"RedisPath":"192.168.0.108:6379"
}
看了很多Asp.net core 讀取配置檔案的部落格,感覺都沒有很好的解決問題。
- 最簡單的就是在StartUp中通過Configuration[“SettingPath:VirtualPath”]的形式獲取資訊;
- 接下來就是在Controller中獲去配置檔案資訊,在控制器中讀取配置檔案有兩種方法。
- 第一種是在controller初始化的時候把IHostingEnvironment,IConfiguration傳過來,然後把穿過來的值賦給controller中對應的變數,酒後就可以正常讀取配置檔案了(由於我是個菜逼,還沒看明白系統啟動的時候,這兩個變數是怎麼傳給controller的)
public class HomeController : Controller
{
//環境變數
private readonly IHostingEnvironment hostingEnvironment;
private IConfiguration Configuration;
public HomeController(IHostingEnvironment hostingEnvironment, IConfiguration configuration)
{
this.hostingEnvironment = hostingEnvironment;
Configuration = configuration;
}
pubilc void GetRedisPath()
{
string redisPath = Configuration["RedisPath"];
}
}
- 第二種是通過獲取物件的方式讀取配置檔案,最近很多部落格說的都是關於這個的。還是在controller初始化的時候把IOptions傳進來(這裡我還是沒懂怎麼傳過來的/(ㄒoㄒ)/~~),然後把傳過來的值賦值給Model的物件,然後就可以正常使用了。
這種方法需要在StartUp中的ConfigureServices中有新增
services.AddOptions();
//SettingPath極為Model
services.Configure<SettingPath>(Configuration.GetSection("SettingPath"));
public class HomeController
{
public SettingPath settingPath;
private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(VideosController));
public HomeController(IOptions<SettingPath> option)
{
settingPath = option.Value;
}
public void GetVideoPath()
{
string path=SettingPath.VideoFilePath
}
}
這裡因為我不瞭解,IOptions是怎麼傳進來的,所以不知道如果有需要只用兩個或以上Model的情況該怎麼處理。
.net core 讀取配置檔案公共類
前面幾種方法之前都有用過,但是個人感覺用起來都不是很順手。而且如果想要在一個類庫中讀取配置檔案的話簡直痛苦到不想理媳婦。
所以自己動手寫了一個工具類
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using System;
namespace Common
{
public class ConfigurationHelper
{
public IConfiguration config { get; set; }
public ConfigurationHelper()
{
IHostingEnvironment env = MyServiceProvider.ServiceProvider.GetRequiredService<IHostingEnvironment>();
config = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables()
.Build();
}
public T GetAppSettings<T>(string key) where T : class, new()
{
var appconfig = new ServiceCollection()
.AddOptions()
.Configure<T>(config.GetSection(key))
.BuildServiceProvider()
.GetService<IOptions<T>>()
.Value;
return appconfig;
}
}
//我比較喜歡單獨放這個類,但是這樣放更明顯
public class MyServiceProvider
{
public static IServiceProvider ServiceProvider { get; set; }
}
}
使用這個類的話需要在StartUp的Configure中新增
MyServiceProvider.ServiceProvider = app.ApplicationServices;
然後就可以在任何地方使用此類讀取配置檔案資訊了,而且由於ConfigurationHelper初始化時已經預設載入環境變數,所以同時具備多環境功能。
string path = new ConfigurationHelper().config["RedisPath"];
SettingPath pathss = new ConfigurationHelper().GetAppSettings<SettingPath>("SettingPath");
參考
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.1
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/environments?view=aspnetcore-2.1
https://www.cnblogs.com/CreateMyself/p/6859076.html