Quartet Lounge Team 2006
A dedicated team on the .Net open source frameworking.
当业务组件与表示层断耦、当Sloth通过反射调用业务方法,配置文件就因为
充当了业务组件与框架之间的桥梁而变得越来越重要。配置文件不再是当年的
.ini
文件,ini文件的节、项值对不再能够满足我们的需要,取而代之的是xml
结构的配置
文件,如今
xml
格式的配置文件处处都是,你可能会因为管理如此众多的配置文件而
觉得恼火,
Sloth的其中一个组件NetRisc.Configuration
提供了对我们自定义
的一种
xml配置文件的管理。

这个组件包含一个配置管理器、一个配置读取器、一个配置书写器以及一个简化了的树形文档结构(标准的Xml文件也是一个树形结构),你可以在此基础上开发基于Sloth框架的配置工具,当然也可以选择像我们一样将自己的作品开源,让感兴趣的开发爱好者发表自己的意见,而这些宝贵的意见正是我们整个项目的动力。

下面从命名空间NetRisc.Configuration中的类的关系图开始来介绍一下这个组件,以及它的工作方式。

 

NetRisc.Configuration Class diagram:

 

 

4_1.JPG

4_2.JPG

 

NetRisc.Configuration.ConfigurationManager

 

       用于管理全局配置文件中存放的各个独立配置文件的路径,独立配置文件的路径保存的是完整的路径,通过该类实现WinForm程序和Web程序都能够访问到各个独立的配置文件,同时管理存储在全局配置文件GlobalConfiguration.xml中的各个独立配置文件路径。

一个通常的全局配置文件GlobalConfiguration.xml看起来像下面这个样子:


     

 <?xml version="1.0"?>

<GlobalConfigurations>

  
<Settings>

    
<SettingItem name="OragnizationType">ConfigurationPerAssembly</SettingItem>

  
</Settings>

  
<Configurations>

    
<ConfigurationItem ParentContainerName="netrisc.database.dbaccess.dll">F: \NetRisc\bin\Debug\NetRisc.DataBase.DBAccess.dll.xml</ConfigurationItem>

  
</Configurations>

</GlobalConfigurations>

你可以看到里面保存了一个netrisc.database.dbaccess.dll的配置文件的路径:
F: \NetRisc\bin\Debug\NetRisc.DataBase.DBAccess.dll.xml
,也就是说组件netrisc.database.dbaccess.dll的配置文件NetRisc.DataBase.DBAccess.dll.xml存放在
F: \NetRisc\bin\Debug\目录下(而全局配置文件本身应该与NetRisc.Configuration.dll组件存放在相同的目录,虽然你可以在实例化ConfigurationManager对象的时候指定全局配置文件的位置,但是我们不推荐这么做)。那么知道了组件的配置文件在哪里,接下来当然是考虑怎么读取这个配置文件。

 

NetRisc.Configuration.ConfigurationReader

 

这个类用于读取各个组件的独立配置文件。该类事例的获取应该使用ConfigurationManager对象的.GetConfigurationReader(string parentContainerName)来获取,正如你看到的那样GetConfigurationReader()方法接受一个容器名称(通常为组件所在程序集的名称)作为参数来获取该程序集(组件)的配置文件读取器对象。和上面全局配置文件实例对比你就可以发现"netrisc.database.dbaccess.dll"正是程序集的名称。

你可以通过下面的代码来获取当前代码运行所在的程序集名称:

C#:

string assemblyName = string.Empty; 

assemblyName 
= System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name;

VisualBasic.NET:

Dim assemblyName As String = String.Empty

assemblyName 
= System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name

 

看到这里你是不是已经跃跃欲试想动手写代码了呢?先别急,我们先考察一个独立配置文件的样例,看看下面这段配置文件的内容:

<?xml version="1.0"?>

<Configurations>

  
<ConfigurationItem name="DefaultDataSourceConfiguration">

    
<Attributes>

      
<DatabaseOperatorFactoryName>NetRisc.Database.DBAccess.dll</DatabaseOperatorFactoryName>

      
<ConnectionString>An oracle database connection string gose here.</ConnectionString>

      
<Encryption>Disabled</Encryption>

      
<FactoryClassName>NetRisc.Database.DBAccess.OracleOperator</FactoryClassName>

    
</Attributes>

    
<Values />

    
<ConfigurationItems />

  
</ConfigurationItem>

</Configurations>


以下是我们已有的Sloth配置工具的展示界面(工具将在近期提供下载)

4_3.JPG

对比该配置文件的树形结构我们可以了解配置文件的结构是怎么样的。每一个配置节点Node包含属性集合,值集合以及一个子配置节点集合,这样的结构使他们可以产生我们需要的树形配置文件结构。

当你已经获取到了期望的配置文件读取器,接下来怎么读取配置信息呢?要说明一点的是当你获取配置文件读取器的同时,配置文件读取器对象内部已经将对应的配置文件信息加载到内存中并以树或者森林的形式存放。通过配置文件读取器对象的配置节点集合ConfigurationReader. Configurations属性可以获取配置文件的二级配置节点(因为所有的独立配置文件,甚至标准的xml配置文档都有一个根节点,而在这里为了便于查找,ConfigurationReader隐藏了根节点直接向外部公布了二级节点作为森林中每棵树的根节点)

ConfigurationReader. Configurations属性是一个NodeCollection类型的集合,你可以通过重载的索引器NodeCollection[string configurationItemName]使用配置节点的名称来快速的找到集合中需要的配置节点对象,同样在一个配置节点对象中的Attributes属性(该属性是一个AttributeCollection类型的集合)可以通过AttributeCollection的索引器[string name]使用属性名称快速的在集合中找到需要的属性对象。

例如:根据上面的独立配置文件实例,假设我们已经获取了配置文件读取器对象cfgReader,那么要获取DefaultDataSourceConfiguration中的属性FactoryClassName的值,请考察下面的代码:

C#:

      

Node cfgNode = cfgReader.Configurations[“DefaultDataSourceConfiguration”];

       
string value = cfgNode.Attributes[“FactoryClassName”].Value;

VisualBasic.NET:

      

      Dim cfgNode As Node = cfgReader.Configurations(“DefaultDataSourceConfiguration”)

       
Dim value As String = cfgNode.Attributes(“FactoryClassName”).Value

这样value中应该保存的是” NetRisc.Database.DBAccess.OracleOperator”,是不是很简单呢?JValueCollection也可以使用同样的方法获取值集合。

通常在程序运行过程中,程序自身不会修改配置文件内容,所以到这里配置文件的读取就可以正常工作了。什么?手工编写配置文件开始头痛是的,到目前为止你只能使用所了解到的配置文件的结构手工编写配置文件,你会发现这是一个繁琐的事情,有什么好的解决办法没有呢?当然有,NetRisc.Configuration命名空间中还提供了一个有用的类NetRisc.Configuration.ConfigurationWriter,这个一看就知道用来做什么的了啦。

 

NetRisc.Configuration.ConfigurationWriter

 

该类用于将内存中树形的配置结构写入到xml配置文件中。同ConfigurationReader类似,我们也建议你只通过ConfigurationManager.GetConfigurationWriter()方法获取一个配置文件写入器,方法ConfigurationManager.GetConfigurationWriter()的参数与获取配置文件读取器的方法参数意思一样。通过调用ConfigurationWriter. WriteConfigurationTree ()方法可以将参数指定的树形配置结构写入到xml配置文件中。假设我们已经获取了名为cfgWriter的配置写入器对象,考察下列代码:

C#:

                    

cfgWriter.WriteConfigurationTree(cfgReader.Configurations);

 cfgWriter.Save();

VisualBasic.NET:

                    

cfgWriter.WriteConfigurationTree(cfgReader.Configurations)

cfgWriter.Save()

到这里NetRisc.Configuration命名空间中的类的主要功能都介绍完了,什么?没有配置工具?有了NetRisc.Configuration.ConfigurationWriter类还怕什么,您完全可以发挥想象力以自己习惯的方式开发出通用的配置工具以及专用配置工具。

 当然,我们先已有一个针对Sloth的专用配置工具,将于近期提供下载。

本篇介绍就到这里啦,谢谢关注!J敬请期待Sloth其他组件的介绍文章。

 

Sloth简介(一)
      http://www.cnblogs.com/duochunyu/articles/536135.html
      Sloth简介(二)
      http://www.cnblogs.com/duochunyu/articles/538654.html
      Sloth简介之Demo实战(一)
      http://www.cnblogs.com/duochunyu/articles/541343.html
      NetRisc.Configuration组件源代码下载
      https://files.cnblogs.com/duochunyu/NetRisc.Configuration_Code_061031.rar

posted on 2006-10-31 10:51  QuartetLounge  阅读(1174)  评论(0编辑  收藏  举报