Enterprise Library的Configuration (zhuan)
lai zi http://www.vbgood.com/vb.good/article-do-view-articleid-3856.html
首先 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名称空间里面大部分类都是英文解释。
在Visual Basic 6里,很多应用程序都曾使用Windows注册表来保存设置。Visual Basic .NET提供了应用程序配置文件来实现同样的功能。这些配置消除了一些同注册表相关联的开发问题,而且使得在你的应用程序里修改设置变得很容易。
首先,创建一个新的Visual Basic .NET工程。其次,向工程里一个新的项目,并选择应用程序配置(Application Configuration)文件。这就会在你的工程里添加一个叫做App.config的新文件。(当应用程序被编译的时候,这个文件命就会被更改为组件的名称。)
这个配置文件是XML格式的。你需要在配置节点下添加一个叫做appSettings的新节点。这个节点包含有应用程序的设置。还要添加一个叫做add的节点,它带有两个属性:key和value。Key包含有用于查找设置的值,而value包含有设置的值:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="testSetting" value="Test Value"/>
</appSettings>
</configuration>
要取得设置的值,就要为AppSettingsReader创建一个新的实例。
Dim settingReader As New System.Configuration.AppSettingsReader()
要取得一个设置,就要调用GetValue方法。它接受两个自变量:key这个值和设置的type:
MsgBox(settingReader.GetValue("testSetting", GetType(String)))
应用程序配置文件为保存应用程序的设置提供了一个方便、简单和可以实现的方法。
首先 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名称空间里面大部分类都是英文解释。
在Visual Basic 6里,很多应用程序都曾使用Windows注册表来保存设置。Visual Basic .NET提供了应用程序配置文件来实现同样的功能。这些配置消除了一些同注册表相关联的开发问题,而且使得在你的应用程序里修改设置变得很容易。
首先,创建一个新的Visual Basic .NET工程。其次,向工程里一个新的项目,并选择应用程序配置(Application Configuration)文件。这就会在你的工程里添加一个叫做App.config的新文件。(当应用程序被编译的时候,这个文件命就会被更改为组件的名称。)
这个配置文件是XML格式的。你需要在配置节点下添加一个叫做appSettings的新节点。这个节点包含有应用程序的设置。还要添加一个叫做add的节点,它带有两个属性:key和value。Key包含有用于查找设置的值,而value包含有设置的值:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="testSetting" value="Test Value"/>
</appSettings>
</configuration>
要取得设置的值,就要为AppSettingsReader创建一个新的实例。
Dim settingReader As New System.Configuration.AppSettingsReader()
要取得一个设置,就要调用GetValue方法。它接受两个自变量:key这个值和设置的type:
MsgBox(settingReader.GetValue("testSetting", GetType(String)))
应用程序配置文件为保存应用程序的设置提供了一个方便、简单和可以实现的方法。