配置文件用处很多,最开始使用是在数据分页数量当中。其次接触是在NHibernate当中。抽象工厂+配置文件是一个很好的应用。通过接口+配置文件,可以很方便的实现开放封闭原则。
配置文件分为:元素,元素集合,节。
元素:
public
class
PersistenceElement : ConfigurationElement
{
[ConfigurationProperty(ConfigName.PropertyName, IsKey = true , IsRequired = true )]
public string EntityClass
{
get
{
return ( string ) this [ConfigName.PropertyName];
}
set
{
this [ConfigName.PropertyName] = value;
}
}
[ConfigurationProperty(ConfigName.PropertyValue, IsRequired = true )]
public string PersistenceClass
{
get
{
return ( string ) this [ConfigName.PropertyValue];
}
set
{
this [ConfigName.PropertyValue] = value;
}
}
}
{
[ConfigurationProperty(ConfigName.PropertyName, IsKey = true , IsRequired = true )]
public string EntityClass
{
get
{
return ( string ) this [ConfigName.PropertyName];
}
set
{
this [ConfigName.PropertyName] = value;
}
}
[ConfigurationProperty(ConfigName.PropertyValue, IsRequired = true )]
public string PersistenceClass
{
get
{
return ( string ) this [ConfigName.PropertyValue];
}
set
{
this [ConfigName.PropertyValue] = value;
}
}
}
元素集合:
public
class
PersistenceElementCollenction : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new PersistenceElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((PersistenceElement)element).EntityClass;
}
public override ConfigurationElementCollectionType CollectionType
{
get { return ConfigurationElementCollectionType.BasicMap; }
}
protected override string ElementName
{
get { return ConfigName.PersistenceElement; }
}
public PersistenceElement this [ int index]
{
get { return (PersistenceElement) this .BaseGet(index); }
set
{
if ( this .BaseGet(index) != null )
{
this .BaseRemoveAt(index);
}
this .BaseAdd(index, value);
}
}
public new PersistenceElement this [ string interfaceShortTypeName]
{
get { return (PersistenceElement) this .BaseGet(interfaceShortTypeName); }
}
public bool ContainsKey( string keyName)
{
bool result = false ;
object [] keys = this .BaseGetAllKeys();
foreach ( object key in keys)
{
if (( string )key == keyName)
{
result = true ;
break ;
}
}
return result;
}
}
{
protected override ConfigurationElement CreateNewElement()
{
return new PersistenceElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((PersistenceElement)element).EntityClass;
}
public override ConfigurationElementCollectionType CollectionType
{
get { return ConfigurationElementCollectionType.BasicMap; }
}
protected override string ElementName
{
get { return ConfigName.PersistenceElement; }
}
public PersistenceElement this [ int index]
{
get { return (PersistenceElement) this .BaseGet(index); }
set
{
if ( this .BaseGet(index) != null )
{
this .BaseRemoveAt(index);
}
this .BaseAdd(index, value);
}
}
public new PersistenceElement this [ string interfaceShortTypeName]
{
get { return (PersistenceElement) this .BaseGet(interfaceShortTypeName); }
}
public bool ContainsKey( string keyName)
{
bool result = false ;
object [] keys = this .BaseGetAllKeys();
foreach ( object key in keys)
{
if (( string )key == keyName)
{
result = true ;
break ;
}
}
return result;
}
}
节:
public
class
PersistenceProperty : ConfigurationSection
{
[ConfigurationProperty(ConfigName.PersistenceElementCollection,
IsDefaultCollection = true )]
public PersistenceElementCollenction GetElementCollection
{
get { return (PersistenceElementCollenction) base [ConfigName.PersistenceElementCollection]; }
}
}
{
[ConfigurationProperty(ConfigName.PersistenceElementCollection,
IsDefaultCollection = true )]
public PersistenceElementCollenction GetElementCollection
{
get { return (PersistenceElementCollenction) base [ConfigName.PersistenceElementCollection]; }
}
}
配置文件的书写方式如下:
<?
xml version
=
"
1.0
"
encoding
=
"
utf-8
"
?>
< configuration >
< configSections >
< section name = " PersistenceSection " type = " Configuration.PersistenceProperty, Configuration " />
</ configSections >
< PersistenceSection >
< Persistences >
< Persistence PropertyName = " A1 " PropertyValue = " A1Factory " ></ Persistence >
< Persistence PropertyName = " A2 " PropertyValue = " A2Factory " ></ Persistence >
< Persistence PropertyName = " A3 " PropertyValue = " A3Factory " ></ Persistence >
</ Persistences >
</ PersistenceSection >
</ configuration >
< configuration >
< configSections >
< section name = " PersistenceSection " type = " Configuration.PersistenceProperty, Configuration " />
</ configSections >
< PersistenceSection >
< Persistences >
< Persistence PropertyName = " A1 " PropertyValue = " A1Factory " ></ Persistence >
< Persistence PropertyName = " A2 " PropertyValue = " A2Factory " ></ Persistence >
< Persistence PropertyName = " A3 " PropertyValue = " A3Factory " ></ Persistence >
</ Persistences >
</ PersistenceSection >
</ configuration >
总结:通过配置文件我们可以动态的加载应用程序集。从而实现开放封闭原则。
下载源代码:文件下载