关于.Net2.0下配置架构的使用

上次用到配置文件,就花了一些时间研究了一下.Net2.0下的配置文件架构,当时感觉确实很强大,完善,但看的有些头晕.迷迷糊糊把实现了要求,就没有再深入研究.
最近,想在配置文件里实现一个复杂的配置,多层次嵌套的配置文件,再把.Net中的配置文档研究了一下,经过这两次的研究,终于彻底搞清楚了。在博客园里已经看到了一篇文章提到了新的配置的研究,地址在这里 http://www.cnblogs.com/Xrinehart/archive/2005/12/03/289978.html 疾风 风行者。文中提到了几个问题,我先补充一下。

引用:
OpenMappedExeConfiguration()有两种重载,我只尝试成功了上述这种,另外一种说是可以从指定配置文件中得到配置对象,但我没成功过,谁要是搞明白了,记得告诉我下。

 

1None.gif   ExeConfigurationFileMap filemap = new ExeConfigurationFileMap();
2None.gif   filemap.ExeConfigFilename = AppDomain.CurrentDomain.SetupInformation.ApplicationBase+"schema.config";
3None.gif   Configuration config;
4None.gif   config = ConfigurationManager.OpenMappedExeConfiguration(filemap, ConfigurationUserLevel.None);
5None.gif
6None.gif

 


以上这个方法就可以打开任意的配置文件。

引用:

请教一下,如果有类似下面的树型结构,有没有好的方法吗?
<job name="all">
<job name="power" command="power on"/>
<job name="test tv">
<job name="step1.1" command="turn on tv" />
<job name="step1.2" command="turn off tv" />

这个功能是完全可以实现的。方法如下
示例如下:
  [ConfigurationProperty("jobs")]
  [ConfigurationCollection(typeof(JobCollection),
            AddItemName="job")]
  public JobCollectionSchemaCollection
  {
   get
   {
    return (JobCollection)this["jobs"];
   }
   set
   {
    this["jobs"] = value;
   }
  }
AddItemName,只要设置了AddItemName这个属性,显示出来的配置文件就是你要求的那样了。从这里也可以看出.Net的架构非常全面,很多功能可能我们都还没有用起来。


我是从System.Configuration命名空间开始研究的。从使用架构的角度,我着重研究了以下几个类的功能。
ConfigurationElement
ConfigurationElementCollection
ConfigurationSection
ConfigurationSectionGroup

我认为,如果要自定义强类型的配置内容,理解以下内容非常重要。
假设我现在的命题是要读写如下的配置文件

    <DataBaseSchemaConfig>
        <Schemas>
            <add SchemaName="TestDataBase" SchemaVersion="1.0" SchemaFlag="1_0" />
            <add SchemaName="TestDataBase2" SchemaVersion="1.1" SchemaFlag="1_1">
                <Tables>
                    <add TableName="T_TEST_TABLE" TableDesc="测试表">
                        <Columns>
                            <add ColumnName="ID" ColumnDesc="标识" ColumnType="System.Int32" />
                            <add ColumnName="Name" ColumnDesc="名称" ColumnType="System.String" />
                            <add ColumnName="Desc" ColumnDesc="描述" ColumnType="System.String" />
                        </Columns>
                    </add>
                </Tables>
            </add>
        </Schemas>
    </DataBaseSchemaConfig>
SectionGroup就是一组Session,这个很好理解。
Section是配置文件中一个节。每一个节都对应了系统中的一个强类型的Section对象,该Section对象将用来处理对应的Section。如果你用系统内置的一些Section对象,那么配置文件的内容就会受到很大的限制。从Configuration的架构来看,应当是派生自己的Section对象用来处理自己的需求。好,下面就上面的命题来看看实现
首先:
我们需要一个根节点,我定义为
 public sealed class DataBaseSchemaConfigSection : ConfigurationSection {
该节点作为整个配置节的入口。 

从配置文件可以看出,根节下面是一个Schemas元素。里面包含了很多Schema元素。可以看出这是一个集合。
所以很自然的,我们应当在DataBaseSchemaConfigSection中加入一个集合对象,这个集合对象用来管理Schema元素对应的对象,也就是我们需要一个 ConfigurationElementCollection
public sealed class DataBaseSchemaCollection : ConfigurationElementCollection

这个对象就可以用来管理下面的Schema对象
public sealed class DataBaseSchemaSection : ConfigurationSection

再往下,实际和前面的型式完全一样,是一层一层嵌套下来的。
public sealed class DataBaseTableCollection : ConfigurationElementCollection
public sealed class DataBaseTableSection : ConfigurationSection
public sealed class DataBaseColumnCollection : ConfigurationElementCollection
public sealed class DataBaseColumnSection : ConfigurationSection

实际上整个的配置文件就是Section,ConfigurationElement的反复使用。
理解了整个架构之后,就可以非常轻松的写出读写自己自定义的配置信息。

从对象到配置文件中的对应,是通过对象的自定义属性实现的。如:

 

None.gif        [ConfigurationProperty("ColumnName",IsKey=true,IsRequired=true)]
ExpandedBlockStart.gifContractedBlock.gif        
public string ColumnName dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get dot.gif
InBlock.gif                
return (string)this["ColumnName"];
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockStart.gifContractedSubBlock.gif            
set dot.gif{
InBlock.gif                
this["ColumnName"= value;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif

 

实际对象的属性数据是保存在祖先类中的,你需要作的是强类型转换成你自己类型。
另外,在自定义属性中,最重要的是元素名称,有可能是Section名称,也可能是作为元素的属性名称。

差不多,理解到这里,基本的应用就应当没有问题了。
再深入研究一下,基实自定义配置的序列化也是可以控制的。准备以后有需要的时候再进行研究。

转载于:https://www.cnblogs.com/goldpicker/archive/2006/08/25/486675.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

https网络编程——openssl中后缀名文件说明以及常用的证书协议

参考&#xff1a;openssl中后缀名文件说明 地址&#xff1a;https://qingmu.blog.csdn.net/article/details/108215177?spm1001.2014.3001.5502 参考&#xff1a;Openssl常用的证书协议有哪些&#xff1f; 地址&#xff1a;https://qingmu.blog.csdn.net/article/details/1082…

idea使用教程

https://www.jianshu.com/p/9c65b7613c30转载于:https://www.cnblogs.com/tnt-33/p/10333267.html

pgbench

参考: http://www.postgres.cn/docs/10/pgbench.html pgbench是pg自带的一个性能测试工具 你也能利用它做性能测试以外的事情 -- 创建测试库 create database pgbench;-- 使用pgbench命令, 初始化测试表 pgbench -i -U zhangtianxiao -p 6001 -d pgbench-- 使用默认表, 默认sq…

煲仔

湖南的煲仔似乎在我毕业工作的那年侵占了大街小巷&#xff0c;满街的煲仔店向外热滋滋的喷着香味&#xff0c;便宜又好味。那几年在外的觅食&#xff0c;除了常德津市牛肉米饭外&#xff0c;煲仔似乎是我唯一的选择。将米放入煲内&#xff0c;加水在火上煮至半熟&#xff0c;再…

https网络编程——中继(负载均衡)工作原理

参考&#xff1a;中继&#xff08;负载均衡&#xff09;工作原理 地址&#xff1a;https://qingmu.blog.csdn.net/article/details/108217055?spm1001.2014.3001.5502 中继&#xff08;负载均衡&#xff09;工作原理 在我们当前社会&#xff0c;比如我们上某宝&#xff0c;某…

2014第18周六

刚睡觉起来&#xff0c;下午将近六点左右回来感觉有点困&#xff0c;就睡了一会儿直到现在刚起来感觉整个人还是很困。今天陪朋友和他妈妈一起去西湖玩了下&#xff0c;转的真有点累。五一假期就这样过完了&#xff0c;没看什么有意义的电视和书籍&#xff0c;也没有去据说很热…

全套支付宝系统架构(内部架构图)【收藏】

据说这是对支付宝系统体系最全最强解析&#xff0c;推荐收藏学习&#xff01; 转载于:https://www.cnblogs.com/SH-xuliang/p/10340745.html

iOS学习之iOS沙盒(sandbox)机制和文件操作之NSFileManager

2019独角兽企业重金招聘Python工程师标准>>> 1、在Documents里创建目录 创建一个叫test的目录,先找到Documents的目录&#xff0c; [cpp] view plain copy NSArray *paths NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); …

触发器与约束的适用条件

触发器是一种特殊类型的存储过程&#xff0c;当对数据库进行UPDATE,DELETE或INSERT时,触发器会生效.触发器可以查询其它表&#xff0c;而且可以包含复杂的 SQL 语句。 创建触发器语法&#xff1a;CREATE TRIGGER trigger_nameON { table | view }[ WITH ENCRYPTION ]{{ { FOR |…

https网络编程——使用openssl库自建根证书

参考&#xff1a;如何自建根证书&#xff1f;使用openssl库自建根证书带图详解 地址&#xff1a;https://qingmu.blog.csdn.net/article/details/108217572?spm1001.2014.3001.5502 目录根证书的普通用途自建根证书步骤1、创建一个目录&#xff0c;存放所有证书有关资料2、进入…

angular接口传参

1、service文件 创建xxx.service.ts文件 import { Injectable, Inject } from angular/core;import { Observable } from rxjs;import { map } from rxjs/operators;import { HttpClient } from angular/common/http;Injectable({ providedIn: root})export class ErrorCond…

lvm-snapshot:基于LVM快照的备份

续 lvm-snapshot&#xff1a;基于LVM快照的备份之准备工作Attention,Please! 重头戏开始啦3.基于LVM快照的备份lvm-snapshot&#xff1a;基于LVM快照的备份(1)事务日志跟数据文件必须在同一个卷上&#xff1b;(2)创建快照卷之前&#xff0c;要请求MySQL的全局锁&#xff1b;在快…

美玉待琢——《一本写满评论的艾泽拉斯收藏指南》

http://bbs.ngacn.com/read.php?tid701056&fpage1 转载于:https://www.cnblogs.com/Evanescence/archive/2006/10/11/526396.html

https网络编程——如何建立利用根证书(凭证)签发建立中继证书(凭证)详解

参考&#xff1a;如何建立利用根证书&#xff08;凭证&#xff09;签发建立中继证书&#xff08;凭证&#xff09;详解 地址&#xff1a;https://qingmu.blog.csdn.net/article/details/108221568?spm1001.2014.3001.5502 目录在建立中继之前需要自建根证书建立根证书的具体步…

NURBS曲线与曲面

B样条方法在表示与设计自由型曲线曲面形状时显示了强大的威力&#xff0c;然而在表示与设计初等曲线曲面时时却遇到了麻烦。因为B样条曲线包括其特例的Bezier曲线都不能精确表示出抛物线外的二次曲线&#xff0c;B样条曲面包括其特例的Bezier曲面都不能精确表示出抛物面外的二次…

IPTV网络电视

IPTV即交互式网络电视&#xff0c;是一种利用宽带网的基础设施&#xff0c;以计算机&#xff08;PC&#xff09;或“普通电视机&#xff0b;网络机顶盒&#xff08;TV&#xff0b;IPSTB&#xff09;”为主要终端设备&#xff0c;向用户提供视频点播、Internet访问、电子邮件、游…

https网络编程——如何利用中继证书(凭证)建立服务器证书

参考&#xff1a;如何利用中继证书&#xff08;凭证&#xff09;建立服务器证书 地址&#xff1a;https://qingmu.blog.csdn.net/article/details/108225569?spm1001.2014.3001.5502 目录建立服务器证书的前提是要建立中继证书建立服务器证书的具体步骤1、建立一个目录&#x…

上传图片

2019独角兽企业重金招聘Python工程师标准>>> private File imageFile;// 上传文件名称private String imageFileFileName;// 上传文件类型private String imageFileContextType; InputStream is new FileInputStream(imageFile);String suffixName imageFileFileN…

解析 XML

解析 XML Firefox 可以自动的将当前页面解析为 DOM&#xff08;文本对象模型&#xff09;&#xff0c; 您也可以通过 XML 语句&#xff08;可以是您自己编写的&#xff0c;也可以是您从远端主机得到的&#xff09;来创建DOM。 例子&#xff1a;将一个字符串解析为 XML var xm…

BZOJ4912 SDOI2017天才黑客(最短路+虚树)

容易想到把边当成点重建图跑最短路。将每条边拆成入边和出边&#xff0c;作为新图中的两个点&#xff0c;由出边向入边连边权为原费用的边。对于原图中的每个点&#xff0c;考虑由其入边向出边连边。直接暴力两两连边当然会被卡掉&#xff0c;注意到其边权是trie上lca的深度&am…