欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net core 系列 11 配置configuration (下)

程序员文章站 2022-07-02 17:02:06
四. 文件配置提供程序AddIniFile、 AddXmlFile、AddJsonFile FileConfigurationProvider 是从文件系统加载配置的基类。 以下配置提供程序专用于特定文件类型: (1) INI 配置提供程序 IniConfigurationProvider: Fil ......

四. 文件配置提供程序addinifile、 addxmlfile、addjsonfile

  fileconfigurationprovider 是从文件系统加载配置的基类。 以下配置提供程序专用于特定文件类型:

    (1) ini 配置提供程序 iniconfigurationprovider: fileconfigurationprovider

    (2) json 配置提供程序 jsonconfigurationprovider: fileconfigurationprovider

    (3) xml 配置提供程序 xmlconfigurationprovider: fileconfigurationprovider

 

  4.1  ini 配置提供程序

    iniconfigurationprovider 在运行时从 ini 文件键值对加载配置,若要激活 ini 文件配置,请在 configurationbuilder 的实例上调用 addinifile 扩展方法。冒号可用作 ini 文件配置中的节分隔符。下面是一个ini配置文件通用示例:

    [section0]
    key0=value
    key1=value

    [section1]
    subsection:key=value

    [section2:subsection0]
    key=value

    [section2:subsection1]
    key=value
//下面是获取各节点中的value值,需要加载的键。
    section0:key0
    section0:key1
    section1:subsection:key
    section2:subsection0:key
    section2:subsection1:key

    下面示例是使用config.addinifile方法加载一个config.ini文件,该方法重载允许指定:(1) optional文件是否可选,(2)reloadonchange如果文件更改,是否重载配置。ifileprovider只读该文件。

    config.setbasepath(directory.getcurrentdirectory());
    config.addinifile("config.ini", optional: true, reloadonchange: true);
    //otherpages/page1页面访问,val 值value
     string val=  configuration.getsection("section0").getsection("key0").value;

asp.net core 系列 11 配置configuration (下)

 

  4.2 json 配置提供程序

    jsonconfigurationprovider 在运行时期间从 json 文件键值对加载配置。若要激活 json 文件配置,请在 configurationbuilder 的实例上调用 addjsonfile 扩展方法。下面是使用config. addjsonfile方法加载一个config.json文件,具体格式可参考appsettings.json

      config.setbasepath(directory.getcurrentdirectory());
      config.addjsonfile("config.json", optional: true, reloadonchange: true);

    效果就不再具体演示,重点讲下注意事项:使用 createdefaultbuilder 初始化新的 webhostbuilder 时,会自动调用 addjsonfile 两次。 调用该方法来从以下文件加载配置:(1)appsettings.json – 首先读取此文件。(2) appsettings.{environment}.json。也就是说调用二次addjsonfile后,addjsonfile才会调用上面显示指定的config.json.

 

  4.3 xml 配置提供程序

    xmlconfigurationprovider 在运行时从 xml 文件键值对加载配置。若要激活 xml 文件配置,请在 configurationbuilder 的实例上调用 addxmlfile 扩展方法。xml文件创建配置键值对时,将忽略配置文件的根节点。 不要在文件中指定文档类型定义 (dtd) 或命名空间。

    config.setbasepath(directory.getcurrentdirectory());
    config.addxmlfile("config.xml", optional: true, reloadonchange: true);

    (1)下面是一个xml配置文件通用示例:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <section0>
        <key0>value</key0>
        <key1>value</key1>
      </section0>
      <section1>
        <key0>value</key0>
        <key1>value</key1>
      </section1>
    </configuration>
//下面是获取各节点中的value值,需要加载的键。 section0:key0 section0:key1 section1:key0 section1:key1

    (2) 如果使用 name 属性来区分元素,则使用相同元素名称的重复元素可以正常工作:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <section name="section0">
        <key name="key0">value</key>
        <key name="key1">value</key>
      </section>
      <section name="section1">
        <key name="key0">value</key>
        <key name="key1">value</key>
      </section>
    </configuration>

    //下面是获取各节点中的value值,需要加载的键。
    section:section0:key:key0
    section:section0:key:key1
    section:section1:key:key0
    section:section1:key:key1

    (3) 属性可用于提供值

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <key attribute="value" />
      <section>
        <key attribute="value" />
      </section>
    </configuration>

    //下面是获取各属性中的value值,需要加载的键。
    key:attribute
    section:key:attribute

 

五. key-per-file 配置提供程序 addkeyperfile

  keyperfileconfigurationprovider 使用目录的文件作为配置键值对。 该键是文件名。 该值包含文件的内容。 key-per-file 配置提供程序用于 docker 托管方案。若要激活 key-per-file 配置,请在 configurationbuilder 的实例上调用 addkeyperfile 扩展方法。 文件的 directorypath 必须是绝对路径。

  下面示例是使用config.addkeyperfile方法加载一个目录文件,在使用docker 托管时具体参考官方文档。

       config.setbasepath(directory.getcurrentdirectory());
       var path = path.combine(directory.getcurrentdirectory(), "path/to/files");
        config.addkeyperfile(directorypath: path, optional: true);

 

 六. 内存配置提供程序addinmemorycollection

   memoryconfigurationprovider 使用内存中集合作为配置键值对。若要激活内存中集合配置,请在 configurationbuilder 的实例上调用 addinmemorycollection 扩展方法。

       /// <summary>
        /// 构建内存对象的键值对
        /// </summary>
        public static readonly dictionary<string, string> _dict =
         new dictionary<string, string>
        {
            {"memorycollectionkey1", "value1"},
            {"memorycollectionkey2", "value2"}
        };

        public static iwebhostbuilder createwebhostbuilder(string[] args) =>
   webhost.createdefaultbuilder(args)
       .configureappconfiguration((hostingcontext, config) =>
       {
           config.addinmemorycollection(_dict);
       })
       .usestartup<startup>();
    //otherpages/page1页面访问,val 值value
    string val=configuration.getsection("memorycollectionkey1").value

asp.net core 系列 11 配置configuration (下)

 

七. 读取getvalue、getsection、getchildren 和 exists

  7.1 getvalue

     configurationbinder.getvalue<t> 从具有指定键的配置中提取一个值,并将其转换为指定类型。 如果未找到该键,则重载允许你提供默认值。以下示例使用键 numberkey 从配置中提取字符串值,键入该值作为 int,并将值存储在变量 intvalue 中。 如果在配置键中找不到 numberkey,则 intvalue 会接收 99 的默认值。

    var intvalue = config.getvalue<int>("numberkey", 99);

  7.2 getsection

    iconfiguration.getsection 使用指定的子节键提取配置子节。getsection 永远不会返回 null。 如果找不到匹配的节,则返回空 iconfigurationsection。

 { 
  "section0": {
    "key0": "value",
    "key1": "value"
  },
  "section1": {
    "key0": "value",
    "key1": "value"
  },
  "section2": {
    "subsection0" : {
      "key0": "value",
      "key1": "value"
    },
    "subsection1" : {
      "key0": "value",
      "key1": "value"
    }
  }
}
    //返回仅包含 section1 中键值对的 iconfigurationsection 对象
    var configsection = _config.getsection("section1");

    //获取 section2:subsection0 中键的值
    var configsection = _config.getsection("section2:subsection0");

  7.3 getchildren

    //在上面的json结构中,获取section2下面的子节点
    var configsection = _config.getsection("section2");

    var children = configsection.getchildren();

  7.4 exists

  //在上面的json结构中,确定配置节是否存在, 为false,是因为配置数据中没有 section2:subsection2 节点
  var sectionexists = _config.getsection("section2:subsection2").exists();

 

八. 绑定到类

   使用getsection方法调用 bind 可以构造 poco 对象。poco就是简单clr对象(plain old clr object),这种类不继承于任何对象(或者说直接继承于object),示例应用包含 starship 模型 (models/starship.cs)。

     config.setbasepath(directory.getcurrentdirectory());
     config.addjsonfile("starship.json",false,true);

  starship实体对应json的 starship 节点

  {
    "starship": {
      "name": "uss enterprise",
      "registry": "ncc-1701",
      "class": "constitution",
      "length": 304.8,
      "commissioned": false
    },
    "trademark": "paramount pictures corp. http://www.paramount.com"
  }
   // otherpages/page1页面绑定starship 节点到starship实体中
       var starship = new models.starship();
       configuration.getsection("starship").bind(starship);

asp.net core 系列 11 配置configuration (下)

 

  总结:

    configuration配置的其它知识点如:将数组绑定至类、自定义配置提供程序、在启动期间访问配置、在 razor pages 页或 mvc 视图中访问配置等等, 请参考官方文档。

    在configuration配置的上下二篇中,讲到了configuration对不同配置来源的加载和读取方法,microsoft.extensions.configuration.iconfiguration中全是以get开头的只读方法,并没有涉及到对配置来源(如json或xml文件)的增删改操作。像配置的xml文件,是否需要引入system.xml.linq来操作xml文件的增删改操呢?带着这个疑问在以后章节再了解。

 

参考文献

官方资料: