zoukankan      html  css  js  c++  java
  • 基于可配置化的设计[原创][4.20更新]

    [有关于EL的Configuration Block和自定化配置]
    这里一共写了三种配置方法,第一种是EL的写法,第二种是ELQuickStart的写法,第三种是一般的写法
    第一种配置写法
       调用处:
            
    ///Found Domain and Title in the CooperationChannelsData.xml
            ChannelConfig channelConfigs = MasterPageHelper.ListChannelProperty();

    -------------------------------------------------------------------

    调用方法:

            
    SearchDomain

            
    GetCookieProperty

            
    SplitString


    -------------------------------------------------------------------

    //************************************************************************************
    // 功能:ChannelCollection
    // 
    //************************************************************************************ 
    namespace Ctrip.UI.DomesticFlight
    {
        
    using System;
        
    using System.Collections.Generic;
        
    using System.Text;
        
    using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
        
    using System.Configuration;

        
    public class CooperationSettings : SerializableConfigurationSection
        
    {
            
    public const string SectionName = "CooperationChannels";
            
    private const string channelSettingsProperty = "ChannelSettings";
            
    private const string DefaultChannelProperty = "DefaultChannel";       

            [ConfigurationProperty(channelSettingsProperty, IsRequired 
    = true)]
            
    public NamedElementCollection<ChannelProperty> Channels
            
    {
                
    get return (NamedElementCollection<ChannelProperty>)base[channelSettingsProperty]; }
            }


            [ConfigurationProperty(DefaultChannelProperty, IsRequired 
    = true)]
            
    public NamedElementCollection<ChannelProperty> DefaultChannel
            
    {
                
    get return (NamedElementCollection<ChannelProperty>)base[DefaultChannelProperty]; }
            }

        }

    }


    -------------------------------------------------------------------

    //************************************************************************************
    // 功能:ConfigurationData
    // 
    //************************************************************************************ 
    namespace XXXX
    {
        
    using System;
        
    using System.Text;
        
    using System.Configuration;
        
    using System.Collections.Generic;
        
    using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
        
    using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder;

        
    public class ChannelProperty : NamedConfigurationElement
        
    {
            
    Define Params

            
    Property
        }


        
    public class ChannelConfigs
        
    {
            
    Init

            
    Property
            
        }

    }


    -------------------------------------------------------------------

    配置文件:

    <?xml version="1.0" encoding="gb2312"?>
    <CooperationChannels>
      
    <ChannelSettings>
        
    <!--Ctrip-->
        
    <!--using Test-->
        
    <add builderName="ctripDomain" 
              domainName
    ="ctrip" 
              name
    ="flights.dev.sh.com:
                    localhost"
              baseTitle="XXXXXXXXXxx"
              cssSrc
    ="/css/Style.css:
                      /css/FlightSearch.css:
                      
    /styles/common/public_global.css:
                      
    /styles/fltDomestic/public_fltDomestic.css:
                      
    /css/private_fltDomestic_choice.css:
                      
    /css/private_fltDomestic_login.css:
                      
    /css/private_fltDomestic_query_again.css:
                      
    /css/public_memCenter.css:
                      
    /css/private_memCenter_sidebar.css:
                      
    /css/private_memCenter_orderManage.css:
                      
    /css/private_fltDomestic_order01.css:
                      
    /css/public_fltDomestic01.css:
                      
    /css/public_global01.css" 
              jsSrc="/JSCRIPT/__utm.js:/JSCRIPT/MasterPage.js:/JSCRIPT/tail_base.js" 
              metaDecContent
    ="XXXXXXXXXXXXXXXXx" 
              metaKeyWordContent
    ="XXXXXXXXXXXXXXxx" 
              headHeight
    ="205px" 
              headWidth
    ="100%"
              footHeight
    ="200px" 
              footWidth
    ="100%"/>
      
    </ChannelSettings>
      
      
    <!--Ctrip-->
      
    <DefaultChannel>
        
    <add builderName="ctripDomain" 
               domainName
    ="XXXXX" 
               name
    ="www.baidu.com"
               baseTitle
    ="XXXXXXXXXXXxxx"
               cssSrc
    ="/css/Style.css:
                       /css/FlightSearch.css:
                       
    /styles/common/public_global.css:
                       
    /styles/fltDomestic/public_fltDomestic.css:
                       
    /css/private_fltDomestic_choice.css:
                       
    /css/private_fltDomestic_login.css:
                       
    /css/private_fltDomestic_query_again.css:
                       
    /css/public_memCenter.css:
                       
    /css/private_memCenter_sidebar.css:
                       
    /css/private_memCenter_orderManage.css:
                       
    /css/private_fltDomestic_order01.css:
                       
    /css/public_fltDomestic01.css:
                       
    /css/public_global01.css" 
               jsSrc="/JSCRIPT/__utm.js:/JSCRIPT/MasterPage.js:/JSCRIPT/tail_base.js" 
               metaDecContent
    ="XXXXXXXXXXXXXXXXXXXXXXx" 
               metaKeyWordContent
    ="XXXXXXXXXXXXXXXx" 
               headHeight
    ="205px" 
               headWidth
    ="100%"
               footHeight
    ="200px" 
               footWidth
    ="100%"/>
      
    </DefaultChannel>
      
    </CooperationChannels>

    -------------------------------------------------------------------

    第二种配置方法的写法
    1.有关于自定义配置
    ----------------------------------------------------------------------------------------------------------------------------------------------------
    MasterPage:      
        
    private void GetRelatedDomainAndSetPageTitle()
            
    {
                NameValueCollection channelCollection 
    = new CooperationChannelsConfig().Settings;

                
    foreach (String channel in channelCollection)
                
    {
                    
    if (channel.Equals(UIHelper.GetServerName(this.Page)))
                    
    {
                        DomainName 
    = channelCollection[channel].Split('|')[0].ToString();
                        
    this.Page.Title = channelCollection[channel].Split('|')[1].ToString();
                        
    break;
                    }

                }


                
    //默认域名[hp]下
                if (String.IsNullOrEmpty(DomainName) == true)
                
    {
                    DomainName 
    = "hp";
                    
    this.Page.Title = "默认标题
    -";          }
            }


    ----------------------------------------------------------------------------------------------------------------------------------------------------

    CooperationChannelsConfig :

    namespace NameSpace
    {
        
    public class CooperationChannelsConfig : IConfigurationSectionHandler
        
    {
            
    /// 实现一个类支持IConfigurationSectionHandler 接口来对自定义节进行处理,完成对自定义节的读取
            public object Create(object parent, object configContext, XmlNode section)
            
    {
                NameValueCollection settings;

                
    try
                
    {
                    NameValueSectionHandler baseHandler 
    = new NameValueSectionHandler();
                    settings 
    = (NameValueCollection)baseHandler.Create(parent, configContext, section);
                }

                
    catch
                
    {
                    settings 
    = null;
                }


                
    return settings;
            }


            
    /// <summary>
            
    /// 返回整个Channel
            
    /// </summary>

            public NameValueCollection Settings
            
    {
                
    get
                
    {
                    
    return (NameValueCollection)ConfigurationManager.GetSection("channel");
                }

            }

        }

    }


    ----------------------------------------------------------------------------------------------------------------------------------------------------

    Global:
    System.Configuration.ConfigurationManager.GetSection(
    "channel"); 

    ----------------------------------------------------------------------------------------------------------------------------------------------------

    Web.config
        
    <section name="channel" type="NameSpace.CooperationChannelsConfig, NameSpace" />
      
    <channel configSource="Config\\Channel.config"/>

    ----------------------------------------------------------------------------------------------------------------------------------------------------

    Channel.config:

    <?xml version="1.0" encoding="gb2312"?>
    <channel>
      
    <add key="gotone.smcc.flights.ctrip.com" value="mc_group|"/>
      
    <!--特商外包-->
      
    <add key="xinhuanet.flights.ctrip.com" value="xinhuanet|新华网"/>
      
    <add key="flights.ctrip.xinhuanet.com" value="ctripxinhuanet|央视国际"/>
      
    <add key="cctv.flights.ctrip.com" value="cctv|"/>
      
    <add key="airchina.flights.ctrip.com" value="airchina|"/>
     
    </channel>

    ----------------------------------------------------------------------------------------------------------------------------------------------------

    第三种配置的写法
    配置项目节点属性类:
    namespace NameSpace
    {
        
    using System.Text;
        
    using System.Configuration;
        
    using String = System.String;

        
    /// <summary>
        
    /// ChannelProperty 
        
    /// </summary>

        public class ChannelProperty : ConfigurationSection
        
    {
            [ConfigurationProperty(
    "urlName")]
            
    public String UrlName
            
    {
                
    get return this["urlName"].ToString(); }
            }


            
    /// <summary>
            
    /// DomainName:crp
            
    /// </summary>

            [ConfigurationProperty("domainName")]
            
    public String DomainName
            
    {
                
    get return this["domainName"].ToString(); }
            }


            
    /// <summary>
            
    /// baseTitle
            
    /// </summary>

            [ConfigurationProperty("baseTitle")]
            
    public String BaseTitle
            
    {
                
    get return this["baseTitle"].ToString(); }
            }


            
    /// <summary>
            
    /// 
            
    /// </summary>

            [ConfigurationProperty("cssSrc")]
            
    public String CssSrc
            
    {
                
    get return this["cssSrc"].ToString(); }
            }

        }

    }

    ----------------------------------------------------------------------------------------------

    namespace NameSpace
    {
        
    using System;
        
    using System.Collections.Generic;
        
    using System.Text;
        
    using System.Configuration;

        [ConfigurationCollection(
    typeof(ChannelProperty))]
        
    public sealed class ChannelCollection : ConfigurationElementCollection
        
    {
            
    protected override ConfigurationElement CreateNewElement()
            
    {
                
    return new ChannelProperty();
            }


            
    protected override object GetElementKey(ConfigurationElement element)
            
    {
                
    return ((ChannelProperty)element).UrlName;
            }

        }


        
    public sealed class CooperationChannels : ConfigurationSection
        
    {
            [ConfigurationProperty(
    "ChannelSettings", IsDefaultCollection = false)]
            [ConfigurationCollection(
    typeof(ChannelCollection), AddItemName = "Channel")]
            
    public ChannelCollection Channels
            
    {
                
    get
                
    {
                    
    return base["ChannelSettings"as ChannelCollection;
                }

            }

        }

    }


    ----------------------------------------------------------------------------------------------

    Channel.Config
    <?xml version="1.0" encoding="gb2312"?>
    <CooperationChannels>
      
    <ChannelSettings>
        
    <Channel domainName="baidu" urlName="www.baidu.com" baseTitle="hp-" cssSrc="" />
        
    <Channel domainName="hp" urlName="www.hp.com" baseTitle="hp-" cssSrc="" />
          
    </ChannelSettings>
    </CooperationChannels>

    ----------------------------------------------------------------------------------------------

    Global文件:
     应添加,去读取Web.Config中的节点
    protected void Application_Start(object sender, EventArgs e)
            
    {          System.Configuration.ConfigurationManager.GetSection("CooperationChannels"); 
    }


    ----------------------------------------------------------------------------------------------

    Web.Config

    <configSections>
        
    <section name="CooperationChannels" type="Ctrip.UI.DomesticFlight.CooperationChannels, Ctrip.UI.DomesticFlight" />
      
    </configSections>

      
    <CooperationChannels configSource="Config\\Channels.config"/>

    ----------------------------------------------------------------------------------------------

    MasterPage页面调用处:
    public partial class MasterPage_DA : System.Web.UI.MasterPage
        
    {
     ChannelProperty configData 
    = null;

                CooperationChannels channelSections 
    = ConfigurationManager.GetSection("CooperationChannels"as CooperationChannels;
                
    foreach (ChannelProperty data in channelSections.Channels)
                
    {
                    
    if (data.UrlName.Equals("www.baidu.com"))
                    
    {
                        configData 
    = data;
                    }

                }

    }


    有关data这个字段,你quickWatch一下。就可以发现Channel.config中的有关于www.baidu.com的节点段中的所有字段都可以取得了。

    最后还是补充一下:
    1.protected abstract ConfigurationElement CreateNewElement() 
    在从配置文件加载集合时,会调用该方法以创建各个元素。
    重写该方法以创建特定类型的自定义 ConfigurationElement 对象。 

    2.protected abstract object GetElementKey(ConfigurationElement element) 
    在派生类中重写时获取指定配置元素的键值。 

  • 相关阅读:
    nginx升级总结,漏洞升级
    【BUG解决】在git上pull时提示You have not concluded your merge. (MERGE_HEAD exists)
    如何自签名把http网站变成https网站(https自签名方法)
    ifly
    Shell排序和二叉树排序
    C/C++复习笔记(2)
    C/C++复习笔记(1)
    C语言字符串操作
    python+flask
    C语言的一点复习
  • 原文地址:https://www.cnblogs.com/RuiLei/p/689940.html
Copyright © 2011-2022 走看看