这几天一直在研究Enterprise Library的Configuration,贴一些心得。

首先 ConfigurationManager类实际上是对一些基本的操作配置数据方法的集合。这个类没有什么具体的用途。

最重要的类是ConfigurationBuilder类,它是建立配置最初的类。
还有就是ConfigurationFile类,它的用途是解析Xml格式的配置文件,还有就是对Xml文件内的节点进行添加、删除、更新的操作。
这个类微软把它写的太复杂了,具体的配置数据和元数据都由它解析。真复杂。

下面说一下当使用
ConfigurationManager.GetConfiguration("配置名称")
的时候,配置系统的操作流程。

首先,他使用ConfigurationManager.Current 内部属性来检查是否已经新建了ConfigurationBuilder类,如果已经建立则调用已经建立的ConfigurationBuilder类。很明显,这是一个典型的单件模式。
然后它调用ConfigurationBuilder类中的ReadConfiguration()方法,参数就是我们输入的那个配置名称。

当建立一个新的ConfigurationBuilder类实例的时候,它通过
System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
属性获取应用程序主配置文件(WinForm是App.config,WebForm是web.config)的完整路径,然后新建一个ConfigurationFile的实例,通过它解析配置文件中“enterpriselibrary.configurationSettings”节点的内容,把所有内容生成一个ConfigurationSettings类的实例,这个实例包含了一个ConfigurationSectionDataCollection集合类实例,他的内容是ConfigurationSectionData。

这个ConfigurationSectionData类和ConfigurationSectionDataCollection类实例就是保存在应用程序配置文件中enterpriselibrary.configurationSettings的内容。
一个ConfigurationSectionDataCollection集合就是一个 “configurationSections”节点的内容。
一个ConfigurationSectionData 就是配置文件里 “configurationSection”节点的内容。

而configurationSectionData类的SectionName属性就是配置文件configurationSection节的name属性。

当解析完应用程序配置文件后,ConfigurationBuilder开始使用ConfigurationSectionDataCollection的索引器查找用户从:
ConfigurationManager.GetConfiguration("配置名称")
方法传递进入的“配置名称”,看看是否集合里面有同名的配置节,如果有,就返回一个configurationSectionData类实例,如果没有,就抛出一个异常。

当获取这个configurationSectionData 实例后,系统开始分析里面的内容,找出配置文件中 configurationSection中 “storageProvider”的内容,当然,当前的版本只有 “XmlFileStorageProviderData”,即具体的配置数据是通过Xml序列化保存在一个.config文件中的,所以就继续查找其path属性,获取用户输入的“配置名称”相关的实际配置数据保存的.config实际地址。
并且获取XmlSerializerTransformerData的数据

到这里,系统处理App.config/web.config的工作到此结束,这时,系统已经知道了具体配置数据保存的xml配置文件的路径和文件名,以及要使用XmlSerializerTransformerData。

下面,控制权转到ConfigurationBuilder处,他通过建立一个新的ConfigurationFile的实例,来解析从App.config处获取的xml配置文件。ConfigurationFile通过XmlTextReader来处理配置文件的所有内容。

它通过一个固定的配置节名称 “xmlSerializerSection”的属性type来获取保存在这个文件里序列化的对象类型,然后通过反射生成这个对象,然后把所有的子节点(Xml反序列化的数据)以及名称给保存在一个HashTable里面。这时,一个Xml文件的解析结束。

大家知道,在应用系统配置文件App.config/Web.config中,配置数据可以是一个集合,也就是说,要处理多个配置文件。故ConfigurationFile中保存解析结果的HashTable对象result是执行线程安全的,ConfigurationBuilder将循环处理所有保存在App.confi中的内容,处理所有的配置文件后,才停止文件解析。
这时,系统才真正处理用户输入的“配置文件名”的工作。
ConfigurationBuilder从缓存中取出用户需要的配置数据,它是一个对象然后新建一个ITransformer接口类型对象(实际上是XmlSerializerTransformer),通过它获取要反序列化的对象类型及数据,执行反序列化,然后通过object对象返回给ConfigurationManager对象,然后再返回给用户。然后用户只要执行一次强制类型转换就可以得到配置的内容了。

实在是太复杂了,到现在还有许多类的用途没有搞懂,包括它是如何建立监视器类启动后台线程监视配置数据改变的。
还有就是ConfigurationContext类和ConfigurationView类的作用还不清楚。太麻烦了。



另:

我下午抽空看了一下Enterprise Library的Cryptography Application Block,我没有发现微软推出这个Block的含义。

首先,这个Block提供两个用途,一个是对用户输入的字符串执行对称加密,令一个是对用户输入的字符串执行Hash散列运算,防止字符串被改动。

这两个方法都不是非常实用。因为.Net的类库里面已经提供了这个功能。如 
System.Security.Cryptography.DESCryptoServiceProvider  执行弱加密
System.Security.Cryptography.TripleDESCryptoServiceProvider 执行强加密

还有使用下面两个类 
System.Security.Cryptography.RSAPKCS1SignatureFormatter   对数据进行散列运算,获取散列 
System.Security.Cryptography.RSAPKCS1SignatureDeformatter 对数据和散列内容执行验证

而且,我使用了它的QuickStart,运行速度不知道为什么非常慢。已经提供的功能为什么要写Block呢?

另外,我觉得非行不爽的就是System.Security.Cryptography.X509Certificates名称空间里面大部分类都是英文解释。

posted on 2005-02-22 17:03  笑望人生  阅读(6883)  评论(2编辑  收藏  举报

导航