zoukankan      html  css  js  c++  java
  • DotText的Web.config配置研究

    1           Web.config配置
    1.1      configSections. Section节配置自定义节的处理器
    1.2      自定义节配置
    自定义节中定义属性type,处理器在解析时,根据type进行后期绑定创建。
    在自定义节中,可以定义子或节,叶子elem对应于[Serializable]类对象。节在类成员属性中部分使用[XmlArray("EntryHandlers")]修饰,返回和设置是数组;部分节直接对应一个类对象,然后进行类似的递归。
    2         类设计
    2.1           自定义节处理器
    XmlSerializerSectionHandler : IConfigurationSectionHandler
    根据type进行反序列化生成节对应的类
    public object Create(object parent, object configContext, System.Xml.XmlNode section) 
    {
           XPathNavigator nav 
    = section.CreateNavigator();
           
    string typename = (string) nav.Evaluate("string(@type)");
           Type t 
    = Type.GetType(typename);
           XmlSerializer ser 
    = new XmlSerializer(t);
           
    return ser.Deserialize(new XmlNodeReader(section));
    }
     

    2.2           子定节的类设计
    BlogConfigurationSettings,跟elem名相同,用[Serializable]修饰。
    ConfigProviderConfiguration,跟elem名不同,用[XmlRoot("ConfigProvider")]修饰。
    子节对应的是数组对象,用[XmlArray("EntryHandlers")]修饰
    属性对应的值为elem的attribute,用[XmlAttribute("imageDirectory")]修饰
    注意,属性(子节点)的反序列化,跟XmlSerializerSectionHandler无关,而是由.NET的XML自己序列化。
    如:
    <Event type = "Dottext.Framework.Tracking.StatsQueueSchedule, Dottext.Framework" minutes = "5" key = "StatsQueue" />
    对应的类跟type(StatsQueueSchedule)无关。

    2.3 读取使用

    return ((HandlerConfiguration)ConfigurationSettings.GetConfig("HandlerConfiguration"));
     
     

    3. 具体相关代码

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <configSections>
            <section name="HandlerConfiguration" type="Dottext.xx.XmlSerializerSectionHandler, Dottext.Framework" /> 
            ...
            <section name="microsoft.web.services" type="Microsoft.Web.Services.Configuration.WebServicesConfiguration, Microsoft.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        </configSections>
        <HandlerConfiguration defaultPageLocation="default.aspx" type="Dottext.Common.UrlManager.HandlerConfiguration, Dottext.Common">
            <HttpHandlers>
                <HttpHandler pattern="(\.config|\.asax|\.ascx|\.config|\.cs|\.vb|\.vbproj|\.asp|\.licx|\.resx|\.resources)$" type="Dottext.Framework.UrlManager.HttpForbiddenHandler, Dottext.Framework" handlerType="Direct" />
                <HttpHandler pattern="(\.gif|\.js|\.jpg|\.zip|\.jpeg|\.jpe|\.css|\.rar|\.xml|\.xsl)$" type="Dottext.Common.UrlManager.BlogStaticFileHandler, Dottext.Common" handlerType="Direct" />
                <HttpHandler pattern="/rss\.aspx$" type="Dottext.Common.Syndication.RssHandler, Dottext.Common" handlerType="Direct" />
                <HttpHandler pattern="/CommentsRSS\.aspx$" type="Dottext.Common.Syndication.RecentCommentsRSS, Dottext.Common" handlerType="Direct" />
                <HttpHandler pattern="/RecentCommentsRSS\.aspx$" type="Dottext.Common.Syndication.RecentCommentsRSS, Dottext.Common" handlerType="Direct" />
                <HttpHandler pattern="/atom\.aspx$" type="Dottext.Common.Syndication.AtomHandler, Dottext.Common" handlerType="Direct" />
            </HttpHandlers>
        </HandlerConfiguration>
    </configuration>
     
     
    using System;
    using System.Configuration;
    using System.Xml;
    using System.Xml.Serialization;
    using System.Xml.XPath;
    namespace Dottext.Framework.Util
    {
     
    public class XmlSerializerSectionHandler : IConfigurationSectionHandler 
     
    {
      
    public object Create(object parent, object configContext, System.Xml.XmlNode section) 
      
    {
       XPathNavigator nav 
    = section.CreateNavigator();
       
    string typename = (string) nav.Evaluate("string(@type)");
       Type t 
    = Type.GetType(typename);
       XmlSerializer ser 
    = new XmlSerializer(t);
       
    return ser.Deserialize(new XmlNodeReader(section));
      }

     }

    }


    using System;
    using Dottext.Framework.Configuration;
    using System.Xml.Serialization;
    namespace Dottext.Framework.Providers
    {
     
    /// <summary>
     
    /// Summary description for ConfigProvider.
     
    /// </summary>

     [XmlRoot("ConfigProvider")]
     
    public class ConfigProviderConfiguration : BaseProvider 
     
    {
      
    public ConfigProviderConfiguration(){}
      
    private string _imageDirectory;
      [XmlAttribute(
    "imageDirectory")]
      
    public string ImageDirectory
      
    {
       
    get {return this._imageDirectory;}
       
    set {this._imageDirectory = value;}
      }

      
    private int _blogID;
      [XmlAttribute(
    "blogID")]
      
    public int BlogID
      
    {
       
    get {return this._blogID;}
       
    set {this._blogID = value;}
      }

     }

    }

    namespace Dottext.Framework.Configuration
    {
     
    /// <summary>
     
    /// Summary description for BlogConfigurationSettings.
     
    /// </summary>

     [Serializable]
     
    public class BlogConfigurationSettings 
     
    {
      
    cnstr
      
    Static
      
    Helper
      
    Properties
            
      
    private EntryHandler[] _entryHandlers;
      
      
    /// <summary>
      
    /// Property EntryFactoryItems (EntryFactoryItem[])
      
    /// </summary>

      [XmlArray("EntryHandlers")]
      
    public EntryHandler[] EntryHandlers
      
    {
       
    get {return this._entryHandlers;}
       
    set {this._entryHandlers = value;}
      }

      
     }

    }
    class
    HandlerConfiguration {
            private string _defaultPageLocation;
            [XmlAttribute("defaultPageLocation")]
            public string DefualtPageLocation
            {
                get {return this._defaultPageLocation;}
                set {this._defaultPageLocation = value;}
            }
           .....
        public static HandlerConfiguration Instance()
            {
                return ((HandlerConfiguration)ConfigurationSettings.GetConfig("HandlerConfiguration"));
            }
    }
  • 相关阅读:
    自定义MyBatis
    SpringMVC基本
    Struts2访问Servlet
    Struts2的配置
    Rust开发环境搭建
    android webview和 javascript 进行交互
    C#开发step步骤条控件
    如何用cmd命令递归文件夹中的所有特定文件,拷贝到另一个文件夹中
    C#用DesignSurface实现一个简单的窗体设计器
    Roslyn如何实现简单的代码提示
  • 原文地址:https://www.cnblogs.com/jasononline/p/767233.html
Copyright © 2011-2022 走看看