UDN-企业互联网技术人气社区

板块导航

浏览  : 690
回复  : 0

[干货] ASP.NET系列:自定义配置节点的复用

[复制链接]
琳琅女称霸全服的头像 楼主
发表于 2015-12-17 21:06:06 | 显示全部楼层 |阅读模式
  appSettings太简单,为每个程序自定义配置节点太复杂,因此要解决app.config&web.config自定义配置的复用问题。

  1.读取不依赖SectionName,根节点可以定义为任何名称。

  2.足够简单,配置项采用name value的形式;足够复杂,采用树型结构,每个节点都可以有多个配置项和子节点。

  3.使用简单,采用路径简化配置项的读取。如: config.Get("root.sub.item-test")。

  一、调用方式:

  1.配置文件:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.   <configSections>
  4.     <section name="node" type="Onion.Configuration.AppConfig.ConfigSection,Onion.Configuration" />
  5.   </configSections>
  6.   <node name="root">
  7.     <items>
  8.       <item name="version" value="1.0.0.1" />
  9.     </items>
  10.     <nodes>
  11.       <node name="runtime">
  12.         <items>
  13.           <item name="debug" value="false" />
  14.           <item name="ioc" value="IoC.Contianer.StructureMAPIoC" />
  15.         </items>
  16.       </node>
  17.       <node name="upload">
  18.         <items>
  19.           <item name="auth" value="true" />
  20.           <item name="path" value="~/upload" />
  21.           <item name="url" value="~/Upload/Index" />
  22.         </items>
  23.       </node>
  24.       <node name="captcha">
  25.         <items>
  26.           <item name="timeout" value="3000" />
  27.           <item name="url" value="~/Captcha/Index" />
  28.         </items>
  29.       </node>
  30.       <node name="oauth2">
  31.         <items>
  32.           <item name="disabled" value ="false" />
  33.           <item name="callback" value ="/Home/ExternalLoginCallBack?ProviderName=" />
  34.         </items>
  35.         <nodes>
  36.           <node name="qqclient">
  37.             <items>
  38.               <item name="disabled" value="false" />
  39.               <item name="method" value="get" />
  40.               <item name="key" value="9233e24d" />
  41.               <item name="secret" value="1ac35907-7cfa-4079-975c-959b98d23a95" />
  42.             </items>
  43.           </node>
  44.           <node name="weiboclient">
  45.             <items>
  46.               <item name="disabled" value="true" />
  47.               <item name="method" value="post" />
  48.               <item name="key" value="0cdea8f3" />
  49.               <item name="secret" value="dc679dbb-7e75-44f7-a99e-5359259fc94b" />
  50.             </items>
  51.           </node>
  52.         </nodes>
  53.       </node>
  54.     </nodes>
  55.   </node>
  56. </configuration>
复制代码


  2.调用代码:

  1. [Fact]
  2.         public void Tests()
  3.         {
  4.             var config = new AppConfigAdapter();

  5.             Assert.True(config.Get<string>("version") == "1.0.0.1");
  6.             Assert.True(config.Get<bool>("runtime.debug") == false);
  7.             Assert.True(config.Get<string>("runtime.ioc") == "IoC.Contianer.StructureMapIoC");
  8.             Assert.True(config.Get<bool>("upload.auth") == true);
  9.             Assert.True(config.Get<string>("upload.path") == "~/upload");
  10.             Assert.True(config.Get<string>("upload.url") == "~/Upload/Index");
  11.             Assert.True(config.Get<int>("captcha.timeout") == 3000);
  12.             Assert.True(config.Get<string>("captcha.url") == "~/Captcha/Index");
  13.             Assert.True(config.Get<bool>("oauth2.disabled") == false);
  14.             Assert.True(config.Get<string>("oauth2.callback") == "/Home/ExternalLoginCallBack?ProviderName=");
  15.             Assert.True(config.GetNode("oauth2").Nodes.Any(o => o.GetItem<bool>("disabled")));
  16.             foreach (var node in config.GetNode("oauth2").Nodes)
  17.             {
  18.                 if (node.Name == "qqclient")
  19.                 {
  20.                     Assert.True(node.GetItem<bool>("disabled") == false);
  21.                     Assert.True(node.GetItem<string>("method") == "get");
  22.                     Assert.True(node.GetItem<string>("key") == "9233e24d");
  23.                     Assert.True(node.GetItem<string>("secret") == "1ac35907-7cfa-4079-975c-959b98d23a95");
  24.                 }
  25.                 else if (node.Name == "weiboclient")
  26.                 {
  27.                     Assert.True(node.GetItem<bool>("disabled") == true);
  28.                     Assert.True(node.GetItem<string>("method") == "post");
  29.                     Assert.True(node.GetItem<string>("key") == "0cdea8f3");
  30.                     Assert.True(node.GetItem<string>("secret") == "dc679dbb-7e75-44f7-a99e-5359259fc94b");
  31.                 }
  32.             }
  33.         }
复制代码


  二、接口定义:

  1.配置项定义:IItem接口定义最基础的配置项,只包含Name和Value属性。

  1. public interface IItem
  2. {
  3.     string Name { get; set; }

  4.     string Value { get; set; }
  5. }
复制代码


  2.配置节点定义:INode接口定义了配置节点的树形结构

  1. public interface INode
  2. {
  3.     string Name { get; set; }

  4.     IEnumerable<IItem> Items { get; set; }

  5.     IEnumerable<INode> Nodes { get; set; }

  6.     string GetItem(string itemName);

  7.     T GetItem<T>(string itemName);
  8. }
复制代码


  3.读取接口定义:IConfig接口定义了配置节点和配置项的读取

  1. public interface IConfig
  2. {
  3.     INode GetNode(string nodeName);

  4.     string Get(string nameORPAth);

  5.     T Get<T>(string nameOrPath);
  6. }
复制代码


  以上3个接口定义了所有的逻辑。

  三、接口实现:

  1.自定义ItemElement(IItem)和ItemElementCollection用于实现单个节点的配置项读取。

  2.自定义NodeElement(INode)和NodeElementCollection用于实现节点树功能。

  3.自定义ConfigSection实现配置节点和配置项读取。

  4.自定义AppConfigAdapter实现IConfig接口。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部