应用框架的设计与实现——.NET平台(6 源码分析)

本文介绍了一种通过自定义配置节处理程序(ConfigurationHandler)来解析.NET配置文件的方法。该方法允许开发者延迟指定具体配置节的读取类,并且这些读取类无需实现IConfigurationSectionHandler接口,从而提供更灵活的配置管理方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者实现方式的特点:
所有自定配置节的读取依靠由接口【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;
        
        }

    }

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值