|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
c++是语言,其实C++和java的应用范围根本就不一样的。在java应用的领域内,c++是不合适的。所以微软才搞了C#和Java对抗。 弁言
古代软件开辟中,各类手艺、技能愈来愈依附设置,比如客户端对用户体验的本性化设置、体系的各类运转时参数设置、可插拔的插件机制、基于设置的IoC架构形式等。设置体例也从最后的二进制存储格局慢慢过分到INI文本格局直至今时所普遍利用的Xml格局。利用Xml格局举行设置,年夜年夜进步了对设置数据的体现才能,可是在.NET1.x中对Xml设置的操控另有诸多方便,特别是对Xml设置的存储同步机制很不完美,而从.NET2.0入手下手,框架供应了更丰厚和易于操控利用的机制。
.NET中的设置文件(Xml)必需以“<configuration>”为根节点,设置文件分为两年夜部分:设置声明区和数据设置区。
设置声明区:位于<configuration><configSections>内,经由过程<section>节点举行声明界说。
数据设置区:位于<configuration>根节点内除<configSections>之外的恣意节点。
数据设置区能够是用户界说的恣意布局条理,可是其“根节点”必需事后在设置声明区界说,运转时会举行无效性检测,一旦发明没有声明的设置节点则会发生一个运转时设置非常。
典范设置文件
<configuration>
<configSections>
<sectionname="dataSystems"type="SWSystem.Data.Configuration.DataSystemsSection,SWSystem.Data"/>
</configSections>
<dataSystems>
<dataSystemname="iMRP"currentProvider="SQLProvider">
<dataProvidername="MSSqlProvider"type="SWSystem.Data.Providers.SQLDataProvider"dataFile="D:ongsoftDevelop2005SWSystem.DataServicesSWDataEngine.xml"connectionString="UID=sa;PWD=;InitialCatalog=iMRP;DataSource=127.0.0.1"/>
<dataProvidername="PostgreSqlProvider"type="SWSystem.Data.Providers.PostgreDataProvider"dataFile="D:ongsoftDevelop2005SWSystem.DataServicesSWDataEngine.xml"connectionString="Server=127.0.0.1;Port=5432;UserId=postgres;Password=postgres;Database=iMRP;Encoding=UNICODE;"/>
<dataModules>
<addname="StockModule"type="Zongsoft.Applications.iMRP.Business.StockModule,Zongsoft.Applications.iMRP.Business"/>
</dataModules>
</dataSystem>
</dataSystems>
</configuration>
概述
在.NET2.0中完成自界说设置,可使用编程或声明性(属性化)代码编写模子创立自界说设置节。
编程模子。此模子请求为每一个节属性(Attribute)创立一个用于猎取和/或设置其值的属性(Property),并将其增加到基本ConfigurationElement基类的外部属性(Property)包中。
声明模子。这类对照复杂的模子也称为属性(Attribute)化模子,同意您经由过程利用属性(Property)来界说节属性(Attribute),并利用属性(Attribute)对其举行润色。
设置文件中的元素称为基础XML元素或节。基础元素只是具有相干属性(假如有)的复杂XML标志。节最复杂的情势与基础元素分歧。而庞大的节能够包含一个或多个基础元素、元素的汇合和其他节。
ConfigurationProperty类暗示设置节点中的特征(Attribute)或它的子元素,我们要做的就是经由过程ConfigurationProperty类将设置实体类中的属性(Property)映照到对应的节点特征(Attribute)。
<P> 设置声明
要在设置文件中利用自界说的设置数据,必需在声明区经由过程<section>节点对自界说设置节处置程序举行声明,该节点有两个必须属性:name和type。
name属性:指定与type属性中指定的设置节处置程序联系关系的设置节或元素的称号。这是该元素在设置文件的设置区中利用的称号。
type属性:指定用来处置name属性所指定的设置节的处置程序。利用以下格局:
type="ConfigurationSectionHandlerClass,AssemblyFileName,Version,Culture,PublicKeyToken"
假如对处置程序的版本没请求,大概其为无地区和强署名的程序集,则能够省略前面的三项,不然必需严厉婚配版本。注重:程序集文件名不要带其扩大文件名(一般为.dll)。
典范设置文件中的设置声明界说如:<sectionname="dataSystems" type="SWSystem.Data.Configuration.DataSystemsSection,SWSystem.Data"/>则暗示数据设置区中的<dataSystems>节点由SWSystem.Data.Configuration.DataSystemsSection类举行处置,而且该类位于SWSystem.Data程序会合。
在.NET1.x中要完成自界说的设置处置程序类,其必需完成IConfigurationSectionHandler接口,如今.NET2.0中只必要将你的处置程序类承继自ConfigurationSection类便可。其处置步骤大抵以下:
起首界说并创立一个ConfigurationPropertyCollection类的实例,用以保留设置节点的特征(Attribute)和它的一切子元素映照,固然你也能够利用ConfigurationElement基类中的Properties属性。
然后创立ConfigurationProperty类以映照到对应的节点特征(Attribute)或子元素。
在范例机关函数或实例机关函数中,将创立的ConfigurationProperty类实例到场到已创立好的ConfigurationPropertyCollection汇合中。
终极,我们的典范设置处置程序类看起来多是如许(假如你利用声明形式则代码看起来没有这么贫苦,这些设置属性类将由框架运转时帮你反射天生,正由于云云,以是它的运转时效力要差些。):
publicclassDataSystemsSection:ConfigurationSection
{
privatestaticreadonlyConfigurationProperty_dataSystems=newConfigurationProperty(null,typeof(DataSystemElementCollection),null,ConfigurationPropertyOptions.IsDefaultCollection);
privatestaticConfigurationPropertyCollection_properties=newConfigurationPropertyCollection();
staticDataSystemsSection()
{
_properties.Add(_dataSystems);
}
publicDataSystemElementCollectionDataSystems
{
get
{
return(DataSystemElementCollection)base[_dataSystems];
}
}
protectedoverrideConfigurationPropertyCollectionProperties
{
get
{
return_properties;
}
}
}
节点映照/设置实体
为一切的设置节点创立对应的设置实体类,该类中的属性(Property)对应节点中的特征(Attribute)和子元素(汇合)。其编写步骤和开辟体例与处置程序相似,只是这时候我们的基类酿成了ConfigurationElement。
publicclassDataSystemElement:ConfigurationElement
{
privatestaticreadonlyConfigurationProperty_name=newConfigurationProperty("name",typeof(string),null,null,newStringValidator(1),ConfigurationPropertyOptions.IsKey|ConfigurationPropertyOptions.IsRequired);
privatestaticreadonlyConfigurationProperty_currentProvider=newConfigurationProperty("currentProvider",typeof(string),string.Empty,ConfigurationPropertyOptions.IsRequired);
privatestaticreadonlyConfigurationProperty_dataModules=newConfigurationProperty("dataModules",typeof(DataModuleElementCollection),null,ConfigurationPropertyOptions.None);
privatestaticreadonlyConfigurationProperty_dataProviders=newConfigurationProperty(null,typeof(DataProviderElementCollection),null,ConfigurationPropertyOptions.IsRequired|ConfigurationPropertyOptions.IsDefaultCollection);
privatestaticConfigurationPropertyCollection_properties=newConfigurationPropertyCollection();
#region范例机关函数
staticDataSystemElement()
{
_properties.Add(_name);
_properties.Add(_currentProvider);
_properties.Add(_dataProviders);
_properties.Add(_dataModules);
}
#endregion
#region机关函数
publicDataSystemElement()
{}
publicDataSystemElement(stringname)
{
this.Name=name;
}
publicDataSystemElement(stringname,stringcurrentProvider)
{
this.Name=name;
this.CurrentProviderName=currentProvider;
}
#endregion
#region大众属性
publicstringName
{
get
{
return(string)base[_name];
}
set
{
base[_name]=value;
}
}
publicStringCurrentProviderName
{
get
{
return(string)this[_currentProvider];
}
set
{
this[_currentProvider]=value;
}
}
publicDataModuleElementCollectionDataModules
{
get
{
return(DataModuleElementCollection)base[_dataModules];
}
}
publicDataProviderElementCollectionDataProviders
{
get
{
return(DataProviderElementCollection)base[_dataProviders];
}
}
#endregion
}
必要注重的是,<dataProvider>和<dataModules>子元素处置体例的差别。
<dataModules>是个嵌套的汇合节点,它上面有尺度的<add>,<remove>,<clear>子元素,且<dataModules>元素不克不及在统一个<dataSystem>节点下呈现屡次。
<dataProvider>是<dataSystem>节点下的间接子节点汇合,<dataProvider>是能够在统一个父节点下呈现屡次的汇合项节点,故必要对其映照的ConfigurationProperty类机关函数中的options参数包括ConfigurationPropertyOptions.IsDefaultCollection列举项(它唆使.NET框架机关一个嵌套节),别的,不克不及指定它对应的设置节点的名字,即必需坚持机关函数中name参数的值为空援用([C#]null/[VB.net]Nothing)或空字符串(String.Empty/"")。
<P> 节点汇合
创立派生自ConfigurationElementCollection的类,在派生类中必需重写(override)的笼统办法:
protectedabstractConfigurationElementCreateNewElement()
在从设置文件加载汇合时,会挪用该办法以创立各个元素。重写该办法以创立特定范例的自界说ConfigurationElement工具。
protectedabstractobjectGetElementKey(ConfigurationElementelement)
在派生类中重写时猎取指定设置元素的键值。
关于非默许的节点汇合类,还必需重写CollectionType和ElementName只读属性的getter,其代码大概以下:
protectedoverridestringElementName
{
get
{
return"dataProvider";//"dataProvider"replacewithyourelementNameincollection.
}
}
publicoverrideConfigurationElementCollectionTypeCollectionType
{
get
{
returnConfigurationElementCollectionType.BasicMap;
}
}
能够重写ThrowOnDuplicate只读属性的getter,以唆使当向ConfigurationElementCollection增加反复的ConfigurationElement是不是会招致激发非常。默许情形,只要当该元素的CollectionType值为AddRemoveClearMap或AddRemoveClearMapAlternate时才会激发非常,假如但愿非默许节点汇合不承受反复项(一般云云),那末就必需重写该属性的getter,一直前往真(true)。
请注重,键和值都不异的元素不会被视为反复元素,而是承受此类元素且不呈现提醒,只要键不异而值分歧的元素才被视为是反复元素。缘故原由是这些元素不会举行合作。可是,没法增加键不异而值分歧的元素,由于没法从逻辑上断定哪一个合作值无效。
索引器的计划形式
一般必要界说索引器的两个重载(overloads),一个承受整型数下标的可读写的索引器;一个是承受字符串键值的只读索引器。
publicDataProviderElementthis[intindex]
{
get
{
return(DataProviderElement)BaseGet(index);
}
set
{
if(BaseGet(index)!=null)
BaseRemoveAt(index);
BaseAdd(index,value);
}
}
publicnewDataProviderElementthis[stringname]
{
get
{
return(DataProviderElement)BaseGet(name);
}
}
其他事项
一般还必要公然一些对汇合操纵的办法,大抵以下:
publicintIndexOf(DataProviderElementvalue)
{
returnBaseIndexOf(value);
}
publicvoidAdd(DataProviderElementvalue)
{
BaseAdd(value);
}
publicvoidRemove(DataProviderElementvalue)
{
if(BaseIndexOf(value)>=0)
BaseRemove(value.Name);
}
publicvoidRemove(stringname)
{
BaseRemove(name);
}
publicvoidRemoveAt(intindex)
{
BaseRemoveAt(index);
}
publicvoidClear()
{
BaseClear();
}
总结
这只是我想要撰写的有关.NET2.0中的基本手艺篇文章中的第一篇。在这篇文章中,我先容了有关设置方面的一些基础观点,并论述了在.NET2.0中怎样定制你本人的设置处置程序,和这过程当中必要注重的一些细节成绩。您已看到,经由过程对.NET2.0中供应的基本架构的扩大,我们能够很简单完成特征化的设置定制。我感觉可以顶到50楼,出乎意料的是大家居然纷纷写出自己的博文,还被编辑做成了专题,置于首页头条。 |
|