Duwamish配置持久化学习笔记
在学习了Duwamish和.Text的配置方法后,对两者的配置持久化做一个比较。
以ApplicationConfiguration为例,Duwamish的配置文件中的<ApplicationConfiguration>...</ApplicationConfiguration>部分对应于Duwamish.SystemFramework.ApplicationConfiguration类,
ApplicationConfiguration类实现了System.Configuration.IConfigurationSectionHandler接口,需要实现一个create()方法,该方法将在调用System.Configuration.GetConfig()方法时自动被调用。在ApplicationConfiguration中有大量的private变量和与这些变量相对应的静态public属性,但这些public属性仅实现了get{},而不实现set{}。例如,TracingEnabled属性的实现:
其中,tracingEnabled为ApplicationConfiguration的私有变量。
另外,在ApplicationConfiguration类中还实现了一个ReadSetting方法,共有四个重载函数,分别提供int,string, bool, TraceLevel四种不同配置类型的设置读取功能。以下为读取string类型的ReadSetting的实现
另一个重要方法是OnApplicationStart(),它是一个静态方法,在Global.asa中的Application_Start()事件中被调用,用于在web站点被访问前,将设置读入System.Configuration.ConfigurationSettings中,而ReadSetting方法正是从ConfigurationSettings中读出设置的。ReadSetting的参数settings是通过baseHandler.Create()方法获得ConfigurationSettings的引用的,如下所示
在配置文件中,我发现一个有趣的现象,add项中的key值为一些不存在类和属性
在以上代码中,SystemFramework.Tracing根本不存在,更不用说Enabled属性了。实际上,这个key仅仅用于标识变量,如果要读取这个设置就可以用ReadSetting(settings,"SystemFramework.Tracing.Enabled",defaultValue)完成,而从web页中读取这个设置则可以用SystemFramework.ApplicationConfiguration.TracingEnabled静态属性。
如果我们想使配置文件与上层的类相对应,可以考虑创建一个SystemFramework.Tracing类(见下图),并加入Enabled属性,然后在Enabled属性中调用SystemFramework.ApplicationConfiguration.TracingEnabled,这样就可以根据类来对配置进行有效分类,同时,也保证配置结构与上层结构的一致
最后是我画的配置持久化模型图:
参考:
《Duwamish深入剖析-配置篇》http://www.aspcool.com/lanmu/browse1.asp?ID=1045&bbsuser=aspnet
以ApplicationConfiguration为例,Duwamish的配置文件中的<ApplicationConfiguration>...</ApplicationConfiguration>部分对应于Duwamish.SystemFramework.ApplicationConfiguration类,
<configSections>
<section name="ApplicationConfiguration" type="Duwamish7.SystemFramework.ApplicationConfiguration, Duwamish7.SystemFramework" />
...
</configSections>
...
<ApplicationConfiguration>
<add key="SystemFramework.Tracing.Enabled" value="False" />
<add key="SystemFramework.Tracing.TraceFile" value="C:\Program Files\Microsoft Visual Studio .NET 2003\Enterprise Samples\Duwamish 7.0 CS\.\DuwamishTrace.txt" />
<add key="SystemFramework.Tracing.TraceLevel" value="4" />
<add key="SystemFramework.Tracing.SwitchName" value="DuwamishTraceSwitch" />
<add key="SystemFramework.Tracing.SwitchDescription" value="Error and information tracing for Duwamish" />
<add key="SystemFramework.EventLog.Enabled" value="True" />
<add key="SystemFramework.EventLog.Machine" value="." />
<add key="SystemFramework.EventLog.SourceName" value="Duwamish7" />
<add key="SystemFramework.EventLog.LogLevel" value="1" />
</ApplicationConfiguration>
<section name="ApplicationConfiguration" type="Duwamish7.SystemFramework.ApplicationConfiguration, Duwamish7.SystemFramework" />
...
</configSections>
...
<ApplicationConfiguration>
<add key="SystemFramework.Tracing.Enabled" value="False" />
<add key="SystemFramework.Tracing.TraceFile" value="C:\Program Files\Microsoft Visual Studio .NET 2003\Enterprise Samples\Duwamish 7.0 CS\.\DuwamishTrace.txt" />
<add key="SystemFramework.Tracing.TraceLevel" value="4" />
<add key="SystemFramework.Tracing.SwitchName" value="DuwamishTraceSwitch" />
<add key="SystemFramework.Tracing.SwitchDescription" value="Error and information tracing for Duwamish" />
<add key="SystemFramework.EventLog.Enabled" value="True" />
<add key="SystemFramework.EventLog.Machine" value="." />
<add key="SystemFramework.EventLog.SourceName" value="Duwamish7" />
<add key="SystemFramework.EventLog.LogLevel" value="1" />
</ApplicationConfiguration>
ApplicationConfiguration类实现了System.Configuration.IConfigurationSectionHandler接口,需要实现一个create()方法,该方法将在调用System.Configuration.GetConfig()方法时自动被调用。在ApplicationConfiguration中有大量的private变量和与这些变量相对应的静态public属性,但这些public属性仅实现了get{},而不实现set{}。例如,TracingEnabled属性的实现:
public static bool TracingEnabled
{
get
{
return tracingEnabled;
}
}
{
get
{
return tracingEnabled;
}
}
其中,tracingEnabled为ApplicationConfiguration的私有变量。
另外,在ApplicationConfiguration类中还实现了一个ReadSetting方法,共有四个重载函数,分别提供int,string, bool, TraceLevel四种不同配置类型的设置读取功能。以下为读取string类型的ReadSetting的实现
public static String ReadSetting(NameValueCollection settings, String key, String defaultValue)
{
try
{
Object setting = settings[key];
return (setting == null) ? defaultValue : (String)setting;
}
catch
{
return defaultValue;
}
}
{
try
{
Object setting = settings[key];
return (setting == null) ? defaultValue : (String)setting;
}
catch
{
return defaultValue;
}
}
另一个重要方法是OnApplicationStart(),它是一个静态方法,在Global.asa中的Application_Start()事件中被调用,用于在web站点被访问前,将设置读入System.Configuration.ConfigurationSettings中,而ReadSetting方法正是从ConfigurationSettings中读出设置的。ReadSetting的参数settings是通过baseHandler.Create()方法获得ConfigurationSettings的引用的,如下所示
NameValueSectionHandler baseHandler = new NameValueSectionHandler();
settings = (NameValueCollection)baseHandler.Create(parent, configContext, section);
settings = (NameValueCollection)baseHandler.Create(parent, configContext, section);
在配置文件中,我发现一个有趣的现象,add项中的key值为一些不存在类和属性
<add key="SystemFramework.Tracing.Enabled" value="False" />
如果我们想使配置文件与上层的类相对应,可以考虑创建一个SystemFramework.Tracing类(见下图),并加入Enabled属性,然后在Enabled属性中调用SystemFramework.ApplicationConfiguration.TracingEnabled,这样就可以根据类来对配置进行有效分类,同时,也保证配置结构与上层结构的一致
namespace SystemFramework
{
class Tracing
{
public static bool Enabled
{
get{return ApplicationConfiguration.TracingEnabled;}
}
}
}
{
class Tracing
{
public static bool Enabled
{
get{return ApplicationConfiguration.TracingEnabled;}
}
}
}
最后是我画的配置持久化模型图:
参考:
《Duwamish深入剖析-配置篇》http://www.aspcool.com/lanmu/browse1.asp?ID=1045&bbsuser=aspnet
版权声明:本文由作者Tony Qu原创, 未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。