.net core 2.0 获取配置信息
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 配置文件的使用

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号