NopCommerce学习笔记(一)----IConfigurationSectionHandler 接口的用法

 IConfigurationSectionHandler:

处理对特定的配置节的访问。

重要事项   IConfigurationSectionHandler 在.NET Framework 2.0 及更高版本已弃用。    但是,因为它在内部使用,而保留。 您可以找到处的一个示例 How to: Create Custom Configuration Sections Using IConfigurationSectionHandler 如果使用上面的示例,请把它生成带有.NET Framework 版本 1.0 或 1.1。

在.NET Framework 2.0 版和更高版本,你必须改为派生自 ConfigurationSection 类,以实现相关的配置节处理程序。 您可以找到处的一个示例 How to: Create Custom Configuration Sections Using ConfigurationSection

实例 IConfigurationSectionHandler 类必须是线程安全且无状态。 Create 方法同时必须是可从多个线程调用。

此外,通过生成的配置对象 Create 方法必须是线程安全且不可变。 因为由配置系统缓存的配置的对象,很重要,不能修改的父参数 Create 方法。例如,如果返回值为 Create 是小型进行修改的父级,必须在其父级不是原始的克隆上进行实际修改。

以上来自MSDN。

上代码:



命名空间:ConsoleApp
public class MySection : IConfigurationSectionHandler
    {
        public object Create(object parent, object configContext, XmlNode section)
        {
            Person person = new Person();
            foreach (XmlNode item in section.ChildNodes)
            {
                if (item.Name == "name")
                {
                    person.Name = item.Attributes["value"].Value;
                }
                else if(item.Name == "address")
                {
                    person.Address = item.SelectSingleNode("/MySection/address").InnerText;
                }
                else if(item.Name == "age")
                {
                    person.Age = int.Parse(item.Attributes["value"].Value);
                }
            }

            return person;
        }
    }

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Address { get; set; }
    }

实现IConfigurationSectionHandler接口


<?xml version="1.0" encoding="utf-8" ?>
<configuration> 
  <configSections>
   <section name="MySection" type="ConsoleApp.MySection,ConsoleApp" />
  </configSections>

  <MySection>
    <name value="John" />
    <age value="29" ></age>
    <address value="123@123" >123@123</address>
  </MySection>



  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>

</configuration>

config配置文件


var person = ConfigurationManager.GetSection("MySection") as Person;

最终调用



ConfigurationSection类使用心得

转载:

ConfigurationSection类主要是方便我们用于扩展自定义webcongfig中的节点信息。我们可以方便的通过以下方式获取【自定义节点对象】

【你自定义的对象】 config = (【你自定义的对象】)ConfigurationManager.GetSection("【你自定义的节点名称,如果是sectiongroup的话,请使用XPATH方式】");

使用自定义节点,可能会涉及到这几个对象的使用:ConfigurationSection【配置域】、ConfigurationElement【节点】、ConfigurationElementCollection【节点列表】

用法一: 配置如下webconfig自定义信息,注意order和lineItem节点都是允许重复出现的 

复制代码
  1 <? xml version = " 1.0 "  encoding = " utf-8 "   ?>
 
2 < configuration >
 
3    < configSections >
 
4      < section name = " orders "  type = " ConsoleTest.OrdersSection, ConsoleTest " />
 
5    </ configSections >
 
6    < orders companyID = " 2001 " >
 
7      < order number = " 100001 "  amount = " 222.22 " >
 
8        < lineItems warehouseNumber = " 02 " >
 
9          < lineItem number = " 00-000-001 "  description = " wii " />
10        </ lineItems >
11      </ order >
12      < order number = " 300001 "  amount = " 33.33 " >
13        < lineItems warehouseNumber = " 99 " >
14          < lineItem number = " 00-000-001 "  description = " xbox 360 " />
15          < lineItem number = " 00-000-003 "  description = " playstation 3 " />
16        </ lineItems >
17      </ order >
18    </ orders >
19 </ configuration >
复制代码

 

下面我们要定义相应的实体对象,该实体对象中会有一个子对象【用来表示节点列表信息】(ConfigurationElementCollection)

 

复制代码
     public   class  OrdersSection : ConfigurationSection
    {
        [ConfigurationProperty(
" companyID " , IsRequired  =   true )]
        
public   string  CompanyID
        {
            
get
            {
                
return  ( string ) base [ " companyID " ];
            }
            
set
            {
                
base [ " companyID " =  value;
            }
        }

        [ConfigurationProperty(
"" , IsDefaultCollection  =   true )]
        
public  OrderElementCollection Orders
        {
            
get
            {
                
return  (OrderElementCollection) base [ "" ];
            }
        }
    }
复制代码

 

 接下来我们在看看节点列表对象的定义,其中会包含一个子对象【ConfigurationElementCollection】

 

复制代码
     public   class  OrderElementCollection : ConfigurationElementCollection
    {
        
protected   override  ConfigurationElement CreateNewElement()
        {
            
return   new  OrderElement();
        }
        
protected   override   object  GetElementKey(ConfigurationElement element)
        {
            
return  ((OrderElement)element).Number;
        }

        
public   override  ConfigurationElementCollectionType CollectionType
        {
            
get
            {
                
return  ConfigurationElementCollectionType.BasicMap;
            }
        }
        
protected   override   string  ElementName
        {
            
get
            {
                
return   " order " ;
            }
        }

        
public  OrderElement  this [ int  index]
        {
            
get
            {
                
return  (OrderElement)BaseGet(index);
            }
            
set
            {
                
if  (BaseGet(index)  !=   null )
                {
                    BaseRemoveAt(index);
                }
                BaseAdd(index, value);
            }
        }
    }
复制代码

 

 那么我们再看看节点对象的定义

 

复制代码
     public   class  OrderElement : ConfigurationElement
    {
        [ConfigurationProperty(
" number " , IsRequired  =   true )]
        
public   string  Number
        {
            
get
            {
                
return  ( string ) base [ " number " ];
            }
            
set
            {
                
base [ " number " =  value;
            }
        }

        [ConfigurationProperty(
" amount " , IsRequired  =   true )]
        
public   double  Amount
        {
            
get
            {
                
return  ( double ) base [ " amount " ];
            }
            
set
            {
                
base [ " amount " =  value;
            }
        }

        [ConfigurationProperty(
" lineItems " , IsDefaultCollection  =   true )]
        
public  LineItemElementCollection LineItems
        {
            
get
            {
                
return  (LineItemElementCollection) base [ " lineItems " ];
            }
        }
    }
复制代码

 

 另外,还有一个子节点列表对象需要定义,【LineItemElementCollection】(ConfigurationElementCollection)

 

复制代码
     public   class  LineItemElementCollection : ConfigurationElementCollection
    {
        [ConfigurationProperty(
" warehouseNumber " , IsRequired  =   true )]
        
public   string  WarehouseNumber
        {
            
get
            {
                
return  ( string ) base [ " warehouseNumber " ];
            }
            
set
            {
                
base [ " warehouseNumber " =  value;
            }
        }

        
protected   override  ConfigurationElement CreateNewElement()
        {
            
return   new  LineItemElement();
        }
        
protected   override   object  GetElementKey(ConfigurationElement element)
        {
            
return  ( (LineItemElement)element ).Number;
        }

        
public   override  ConfigurationElementCollectionType CollectionType
        {
            
get
            {
                
return  ConfigurationElementCollectionType.BasicMap;
            }
        }
        
protected   override   string  ElementName
        {
            
get
            {
                
return   " lineItem " ;
            }
        }

        
public  LineItemElement  this [ int  index]
        {
            
get
            {
                
return  (LineItemElement)BaseGet(index);
            }
            
set
            {
                
if  (BaseGet(index)  !=   null )
                {
                    BaseRemoveAt(index);
                }
                BaseAdd(index, value);
            }
        }
    }
复制代码

 

当然我们还得再定义一个节点对象【LineItemElement

复制代码
     public   class  LineItemElement : ConfigurationElement
    {
        [ConfigurationProperty(
" number " , IsKey = true , IsRequired  =   true )]
        
public   string  Number
        {
            
get
            {
                
return  ( string ) base [ " number " ];
            }
            
set
            {
                
base [ " number " =  value;
            }
        }

        [ConfigurationProperty(
" description " , IsRequired  =   true )]
        
public   string  Description
        {
            
get
            {
                
return  ( string ) base [ " description " ];
            }
            
set
            {
                
base [ " description " =  value;
            }
        }
    }
复制代码

 

这样我们就完成了webconfig节点的自定义和对象的实体化, 我们在使用的使用值需要简单的代码就能获取到相应对象的实体信息;如:

OrdersSection  config = (OrdersSection)ConfigurationManager.GetSection("orders");

 

 

 

 

另一中用法:sectionGroup 配置 。如要配置出如下webconfig信息

 

复制代码
   < configSections >
    
< sectionGroup name = " mygroup " >
      
< section name = " mysection "
                       type
= " ConfigSection "
                        allowDefinition
= " Everywhere "
                         allowLocation
= " true " />
    
</ sectionGroup >
  
</ configSections >

  
< mygroup >
    
< mysection  user = " 用户 "  password = " 密码 " >
      
< element element1 = " 属性1 "  element2 = " 属性2 " ></ element >
    
</ mysection >
  
</ mygroup >
复制代码

 

 那么我们看下实体是如何定义的 。

 

复制代码
using  System;
using  System.Data;
using  System.Configuration;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

///   <summary>
///  ConfigSection 的摘要说明
///   </summary>
public   class  ConfigSection:ConfigurationSection
{
    
public  ConfigSection()
    {
        
//
        
//  TODO: 在此处添加构造函数逻辑
        
//
    }
[ConfigurationProperty(
" user " ,DefaultValue = " yanghong " ,IsRequired = true )]
    
public   string  User
    {
        
get  {  return  ( string ) this [ " user " ]; }
        
set  {  this [ " user " =  value; }
    }

    [ConfigurationProperty(
" password " ,DefaultValue = " password " ,IsRequired = true )]
    
public   string  PassWord
    {
        
get  {   return  ( string ) this [ " password " ]; }
        
set  {  this [ " password " =  value; }
    }

    [ConfigurationProperty(
" element " )]
    
public  elementinfo Element
    {
        
get  {  return   (elementinfo) this [ " element " ]; }
        
set  { this [ " element " =  value; }
    }
}
复制代码

 

 上面的实体对象包含一个节点对象信息,我们看下这个对象是如何定义的 。

 

复制代码
public   class  elementinfo : ConfigurationElement
{
    
public  elementinfo()    { }


    [ConfigurationProperty(
" element1 " , DefaultValue  =   " element1 " , IsRequired  =   true )]
    
public   string  Element1
    {
        
get  {  return  ( string ) this [ " element1 " ]; }
    }

    [ConfigurationProperty(
" element2 " ,DefaultValue = " element2 " ,IsRequired = true )]
    
public   string  Element2
    {
        
get  {  return  ( string ) this [ " element2 " ]; }
    }


}
复制代码

 

 

代码的调用就相当简单了 :

 

    ConfigSection config  =  (ConfigSection)ConfigurationManager.GetSection( " mygroup/mysection " );
    Response.Write(
" 用户名: " + config.User.ToString()  +   " 密码: "   +  config.PassWord.ToString()  +   " 元素属性: "   +  config.Element.Element1.ToString()  +  config.Element.Element2.ToString());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值