看干货请移步至. 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://www.cnblogs.com/CreateMyself/p/6859076.html
来源: https://www.cnblogs.com/hoyu/p/10026781.html