作者实现方式的特点:
所有自定配置节的读取依靠由接口【IConfigurationSectionHandler】继承来的类SAF.Configuration.ConfigurationHandler;
具体配置节的读取类是什么推迟到配置节内再指定(<Framework type=...),读取类也不需去继承接口【IConfigurationSectionHandler】;
App.Config
<configuration>
<configSections>
<section name="Framework" type="SAF.Configuration.ConfigurationHandler,SAF.Configuration" />
<section name="MyApplication" type="SAF.Configuration.ConfigurationHandler,SAF.Configuration" />
</configSections>
<Framework type="SAF.Configuration.ConfigurationManager,SAF.Configuration">
<SAF.EventNotification>
<Server>localhost</Server>
<Port>4000</Port>
<ApplicationName>EventNotification</ApplicationName>
<ObjectUri>EventURI</ObjectUri>
</SAF.EventNotification>
</Framework>
<MyApplication type="Application.Configuration.AppConfigurationManager,Application.Configuration">
<Application.Configuration>
<ConfigurationAgent>
<Agent name = "WSAgent1" type="TestConfigurationAgent.ConfigurationWSAgent,TestConfigurationAgent">
<Parameters>
<Section>Application.MessageQueue</Section>
<Environment>QAEnvironment</Environment>
</Parameters>
<Url>http://localhost/ConfigurationData/ConfigurationService.asmx</Url>
</Agent>
</ConfigurationAgent>
</Application.Configuration>
<Application.Database>
<ConnectionString>Persist Security Info=False;User ID=sa;Password=password;Initial Catalog=pubs;Data Source=127.0.0.1</ConnectionString>
</Application.Database>
<Application.MessageQueue ConfigurationAgent="WSAgent1" >
</Application.MessageQueue>
</MyApplication>
</configuration>
Application.Configuration.AppConfigurationManager
/// <summary>
/// A sample configuration system for the business application
/// it shows how you can extend the SAF.Configuraiton with your custom
/// configuration manager and objectsl
/// </summary>
public class AppConfigurationManager
{
public DatabaseConfiguration DatabaseConfig;
public MessageQueueConfiguration MessageQueueConfig;
private XmlNode configurationData;
/// <summary>
/// the constructor start the chain reaction of
/// creating all the configuration object used by the application
/// </summary>
/// <param name="sections">the xml element containing the configuraiton settings</param>
public AppConfigurationManager(XmlNode sections)
{
configurationData = sections;
ConfigurationAgentManager cam = new ConfigurationAgentManager(configurationData);
//create the indivdual configuraiton object and assign them to the public fields
DatabaseConfig = new DatabaseConfiguration(cam.GetData("Application.Database"));
MessageQueueConfig = new MessageQueueConfiguration(cam.GetData("Application.MessageQueue"));
}
}
SAF.Configuration.ConfigurationHandler
/// <summary>
/// Summary description for Class1.
/// </summary>
public class ConfigurationHandler : System.Configuration.IConfigurationSectionHandler
{
public object Create(Object parent, object configContext, XmlNode section)
{
Type type = System.Type.GetType(section.Attributes["type"].Value);
object[] parameters = {section};
//call the configuration object's constructor
object configObject = null;
try
{
configObject = Activator.CreateInstance(type, parameters);
}
catch (Exception ex)
{
string x = ex.Message;
return null;
}
return configObject;
}
}
所有自定配置节的读取依靠由接口【IConfigurationSectionHandler】继承来的类SAF.Configuration.ConfigurationHandler;
具体配置节的读取类是什么推迟到配置节内再指定(<Framework type=...),读取类也不需去继承接口【IConfigurationSectionHandler】;
App.Config

































Application.Configuration.AppConfigurationManager

























SAF.Configuration.ConfigurationHandler























