mvc_core_config
在.net core mvc中 配置文件格式更改为json且移除了ConfigurationManager.AppSettings[xmlkey]的方法,
那么,如何来获取配置信息呢?
第一步 将json文件添加到应用程序中
<default code>
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
如果是使用默认的方法来启动的,则可以跳过此步
<reason>
查看源码 在 CreateDefaultBuilder方法中已使用添加配置文件
//配置信息处理 -- 用于第二步的读取配置信息
.ConfigureAppConfiguration((Action<WebHostBuilderContext, IConfigurationBuilder>) ((hostingContext, config) =>
{
//注入运行环境
IHostingEnvironment hostingEnvironment = hostingContext.HostingEnvironment;
//加载配置文件
config.AddJsonFile("appsettings.json", true, true).AddJsonFile(string.Format("appsettings.{0}.json", (object) hostingEnvironment.EnvironmentName), true, true);
//根据运行环境加载相应文件
if (hostingEnvironment.IsDevelopment())
{
Assembly assembly = Assembly.Load(new AssemblyName(hostingEnvironment.ApplicationName));
if (assembly != (Assembly) null)
config.AddUserSecrets(assembly, true);
}
config.AddEnvironmentVariables();
if (args == null)
return;
config.AddCommandLine(args);
}))
自定义添加配置文件请参考以上代码
第二步 读取配置信息
<code>
<Startup>
//由于在程序启动时已经配置了configuration 则可以直接通过构造方法获取配置信息
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
第三步 在Controller 获取配置信息
<code>
<Startup>
<method --> ConfigureServices>
//添加选项
services.AddOptions();
//将配置信息进行DI注入
services.Configure<AppSetting>(Configuration.GetSection(nameof(AppSetting)));
<相关方法说明>
GetSection:
key-value 取值
类似于Dictionary取值的操作
Configure:
进行DI注入
关键性代码:
//进行DI注入 AddSingleton 全局共享一个 IOptionsChangeTokenSource<TOptions> 注入参数对应的type
services.AddSingleton<IConfigureOptions<TOptions>>((IConfigureOptions<TOptions>) new NamedConfigureFromConfigurationOptions<TOptions>(name, config))
即实际上还是利用AddSingleton注入实现
<source code>
/// <summary>
/// Registers a configuration instance which TOptions will bind against. 将配置实例作为option绑定到参数上
/// </summary>
/// <typeparam name="TOptions">The type of options being configured.</typeparam>
/// <param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" /> to add the services to.</param>
/// <param name="config">The configuration being bound.</param>
/// <returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" /> so that additional calls can be chained.</returns>
public static IServiceCollection Configure<TOptions>(this IServiceCollection services, IConfiguration config) where TOptions : class
{
return services.Configure<TOptions>(Microsoft.Extensions.Options.Options.DefaultName, config);
}
/// <summary>
/// Registers a configuration instance which TOptions will bind against.同上
/// </summary>
/// <typeparam name="TOptions">The type of options being configured.</typeparam>
/// <param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" /> to add the services to.</param>
/// <param name="name">The name of the options instance.</param>
/// <param name="config">The configuration being bound.</param>
/// <returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" /> so that additional calls can be chained.</returns>
public static IServiceCollection Configure<TOptions>(this IServiceCollection services, string name, IConfiguration config) where TOptions : class
{
if (services == null)
throw new ArgumentNullException(nameof (services));
if (config == null)
throw new ArgumentNullException(nameof (config));
//进行DI注入 AddSingleton 全局共享一个 IOptionsChangeTokenSource<TOptions> 注入参数对应的type
services.AddSingleton<IOptionsChangeTokenSource<TOptions>>((IOptionsChangeTokenSource<TOptions>) new ConfigurationChangeTokenSource<TOptions>(name, config));
return services.AddSingleton<IConfigureOptions<TOptions>>((IConfigureOptions<TOptions>) new NamedConfigureFromConfigurationOptions<TOptions>(name, config));
}
<Controller>
public abstract class BaseController : Controller
{
protected AppSetting AppSetting { get; set; }
protected BaseController(IOptions<AppSetting> option) => AppSetting = option.Value;
}
intro:由于在mvc经常会使用配置信息,于是我便将获取配置信息的相关处理封装在一个抽象控制器中,故只需要在使用配置信息的控制器中继承此控制器即可
然后就可以在控制器中通过AppSetting获取配置信息了
扩展说明
在Startup中直接获取配置文件:
public Startup(IApplicationEnvironment appEnv, IHostingEnvironment env) {
_config = new ConfigurationBuilder()
.AddJsonFile("config.json")
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables()
.Build();
}
[https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.1&tabs=basicconfiguration](https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.1&tabs=basicconfiguration "官方教程")
补充说明:
看见很多人说配置信息的获取不能实时更新,其实只是应用方式错了罢了
通过查看源码可以知道
《source code》
services.AddSingleton<IOptionsChangeTokenSource<TOptions>>((IOptionsChangeTokenSource<TOptions>) new ConfigurationChangeTokenSource<TOptions>(name, config));
微软实际上是有采用修改监听的
故只需要将我们控制构造中的IOptions<> 替换为 IOptionsMonitor<>即可实时读取配置信息
//读取最新值
IOptionsMonitor<>.CurrentValue
IOptionsMonitor
定义:解析
//获取最新值
TOptions CurrentValue { get; }
//通过given name获取值
TOptions Get(string name);
//当值发送改变时触发
IDisposable OnChange(Action<TOptions, string> listener);
通过定义可知IOptionsMonitor是一个类似于监听器的存在
所以应该就是通过这个来实时进行更新的
备注:其中使用的AppSetting 即 我配置信息对应的实体类 【可根据实际情况进行命名】
欢迎各位大佬评论并指出我的错误 :)
author:monster
since:6/4/2018 11:12:45 AM
direction:.net core 2.0 mvc 配置文件的使用