ASP.NET CORE 中自动集成了应用配置,支持从以下 源 处获取配置键值对

  • 命令行
  • 环境变量
  • 内存
  • 文件配置

其中文件配置是我们最常用的方式,默认文件是.json的json格式文件,摒弃了以往.config的xml的文件格式。

应用配置有以下几个约定:

  • 键不区分大小写,如果存在相同的键,则取最后一个值
  • 分层键 : 取子节点。或者__双下划线
  • 值默认为字符串
  • 不存储NULL值

那么

问:配置文件是如何加载的呢?

答:默认加载appsettings.json,如果有自定义的文件需要加载,则需要在WEBHOST初始化时添加文件路径。

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
//config.SetBasePath(Directory.GetCurrentDirectory());//如果iis调试,请注释
config.AddJsonFile("appsettings_ext.json", optional: false, reloadOnChange: false);
})
.UseStartup<Startup>();

问:如果获取配置文件内容

答:IConfiguration。支持在任何地方注入。并有以下几个主要获取Value的方法

配置文件示例:

  "one": "1",
"two": { "_two": "2" },
"fourToSeven": [ "4", "5", "6", "7" ],
"People": {
"Name": "gt",
"Male": "1"
},
"Books": [
{ "Name": "语文" },
{ "Name": "数学" }
]

取值方式

//直接获取键值对的Value
_configuration.GetValue<string>("one"); //获取子节点的Value,使用约定:
_configuration.GetValue<string>("two:_two");
//或者获取section的子节点,再去获取Value
_configuration.GetSection("two").GetChildren().First(x => string.Equals("_two", x.Key, StringComparison.CurrentCultureIgnoreCase)); //获取数组的方式,本质是一个
_configuration.GetSection("fourToSeven").Get<string[]>();

问:实际应用中我们通常使用类对象来表示配置,.NET CORE里面是如何绑定到类的

答:.NET CORE提供了Bind方法来将配置绑定到类,另外还提供了Options方式来实现

            //获取Section绑定到对象类,注意对象类的属性值要和配置中一致
var user = new People();
_configuration.GetSection("People").Bind(user);
_people = user; //也可以采用万能的Get方式,更为简洁
_configuration.GetSection("people").Get<People>(); public class People
{
public string Name { get; set; }
public int Male { get; set; }
}

  Options方式应该是我们日常应用中常用的方式,毕竟IConfiguration需要在使用的地方注入,且需要知道KEY,这就形成了硬编码模式。

我们先定义一个Options,

    public class BookOptions
{
public string Name { get; set; }
}

  那么我们可以在Startup类的ConfigureServices中进行 配置。

    services.Configure<List<BookOptions>>(Configuration.GetSection("books"));
//这种方式可以给配置项目一个名称,获取的时候根据名称获取
services.Configure<List<BookOptions>>("myname",Configuration.GetSection("books"));

  使用Options也是通过注入的方式使用(万恶的.NET CORE,无处不在注入)。.NET CORE使用 IOptionsMonitor<T>注入的方式,同时其也控制着Options生命周期 。

        private readonly List<BookOptions> _books;
private readonly List<BookOptions> _booksNamed; public ConfigController(IConfiguration configuration,
IOptionsMonitor<List<BookOptions>> bookAccessor,
IOptionsSnapshot<List<BookOptions>> bookNamedAccessor)
{
_configuration = configuration;
_books = bookAccessor.CurrentValue;
_booksNamed = bookNamedAccessor.Value;
}

  IOptionsSnapshot<TOptions> 支持包含最小处理开销的重新加载选项。针对请求生存期访问和缓存选项时,每个请求只能计算一次选项。

.NET CORE配置使用大抵如此,当然实际应用中可能会更复杂点,其也提供了很多扩展方法。

最新文章

  1. IE内核发送ajax请求时不会将url中的参数编码
  2. jQuery---中的动画
  3. PS1应用之——修改linux终端命令行各字体颜色
  4. BZOJ1565: [NOI2009]植物大战僵尸
  5. POJ 1681---Painter&#39;s Problem(高斯消元)
  6. ASP.NET MVC 4框架揭秘(微软6任MVP,高级软件顾问蒋金楠新作)
  7. Delphi RICHEDIT中插入图象
  8. [LeetCode 112 113] - 路径和I &amp; II (Path Sum I &amp; II)
  9. 推荐一款JavaScript日历控件:kimsoft-jscalendar
  10. jQuery.reveal弹出层使用
  11. zookeeer client 通信协议
  12. 在vs2013上的编译tesseract-ocr
  13. 【图文详解】HDFS基本原理
  14. noj算法 迷宫问题 回溯法
  15. 高德地图JS API 开发小结
  16. js的==和===练习
  17. JDK8的ConcurrentHashMap也会造成CPU 100%
  18. scanf printf gets() puts(),cin cout
  19. 常见MQ流行度比较
  20. Stage3d AGAL GPU处理照片 旧照片效果 sepia || pixelbender

热门文章

  1. Fedora20 安装 MySQL
  2. [MGR——Mysql的组复制之多主模式 ] 详细搭建部署过程
  3. Spring MVC页面重定向实例
  4. react-document-title
  5. 理解Android进程创建流程(转)
  6. Spark应用远程调试
  7. STL源代码剖析——STL算法之set集合算法
  8. ArrayAdapter requires the resource ID to be a TextView
  9. HDU 4897 Little Devil I 树链剖分+线段树
  10. C 编程中fseek、ftell的用法总结