• asp.net20自定义配置节学习笔记(二)


    首先申明:本文大部分内容来自于http://www.cnblogs.com/guozhijian/
    -------------------------
    1. 实现目的
        我希望在web.config中,配置网站信息,管理员信息,和用户信息(当然这个配置有点不切实际了,这里只是为了演示),所以,我希望按下面的格式做配置。
    <siteSetting siteName="遇见未来" siteVersion="1.0" closed="false">
        
    <siteAdmin adminId="1" adminName="guozhijian"/>
        
    <siteUsers>
          
    <siteUser userId="1" userName="zhanglanzhen"/>
          
    <siteUser userId="2" userName="wdy"/>
        
    </siteUsers>
      
    </siteSetting>
         这个siteSetting配置节点是一个稍微复杂一点的配置,自己包含有Attributes,同时包含子节点siteAdmin, siteUsers, 而siteUsers又包含多个siteUser子节点。
        接下来我要定义几个类,分别代表各个不同的节点。有一定的规则:
        代表根节点,也就是siteSetting节点的类,继承自ConfigurationSection
        代表单一子节点的siteAdmin, siteUser类,继承自ConfigurationElement
        包含多个同名子节点的siteUsers类,继承自ConfigurationElementCollection
    而siteSetting这个配置点需要注册,代码示例如下:
     <configSections>
       <section name="siteSetting" type="处理程序" />
    </configSections>
    2、实现过程
    第一步:实现单一节点的类,也就是代表siteAdmin和siteUser的类:
     1public class SiteAdmin : ConfigurationElement
     2{
     3    [ConfigurationProperty("adminId", DefaultValue = "1", IsRequired = true)]
     4    public int AdminId
     5    {
     6        get return Int32.Parse(this["adminId"].ToString()); }
     7        set this["adminId"= value; }
     8    }

     9    [ConfigurationProperty("adminName", DefaultValue = "McJeremy", IsRequired = true)]
    10    public string AdminName
    11    {
    12        get return this["adminName"].ToString(); }
    13        set this["adminName"= value; }
    14    }

    15}

    16public class SiteUser : ConfigurationElement
    17{
    18    [ConfigurationProperty("userId", DefaultValue = "1", IsRequired = true)]
    19    public int UserId
    20    {
    21        get return Int32.Parse(this["userId"].ToString()); }
    22        set this["userId"= value; }
    23    }

    24    [ConfigurationProperty("userName", DefaultValue = "McJeremy", IsRequired = true)]
    25    public string UserName
    26    {
    27        get return this["userName"].ToString(); }
    28        set this["userName"= value; }
    29    }

    30}
    第二步:实现包含多个同名节点(siteUser)的siteUsers类
     1public class SiteUsers : ConfigurationElementCollection
     2{
     3    override protected ConfigurationElement CreateNewElement()
     4    {
     5        return new SiteUser();
     6    }

     7    /// <summary>
     8    /// 重写该方法以确定SiteUser的键值
     9    /// </summary>
    10    /// <param name="element"></param>
    11    /// <returns>返回UserId,因此,SiteUser的键为UserId</returns>

    12    override protected object GetElementKey(ConfigurationElement element)
    13    {
    14        SiteUser siteUser = element as SiteUser;
    15        return siteUser.UserId;
    16    }

    17    public override ConfigurationElementCollectionType CollectionType
    18    {
    19        get
    20        {
    21            return ConfigurationElementCollectionType.BasicMap;
    22        }

    23    }

    24    public void Add(ConfigurationElement element)
    25    {
    26        BaseAdd(element);
    27    }

    28    public void Remove(int key) //因为SiteUser的键是int型的,所以参数也要是int型的。
    29    {
    30        BaseRemove(key);
    31    }

    32    protected override string ElementName //集合下节点的名称
    33    {
    34        get
    35        {
    36            return "siteUser";
    37        }

    38    }

    39}

    40
    第三步:实现根节点类
     1public class SiteSetting : ConfigurationSection
     2{
     3    [ConfigurationProperty("siteName", DefaultValue = "McJeremy的测试",IsRequired=true)]
     4    public string SiteName
     5    {
     6        get return this["siteName"].ToString(); }
     7        set this["siteName"= value; }
     8    }

     9    [ConfigurationProperty("siteVersion", DefaultValue = "1.0")]
    10    public string SiteVersion
    11    {
    12        get return this["siteVersion"].ToString(); }
    13        set this["siteVersion"= value; }
    14    }

    15    [ConfigurationProperty("closed", DefaultValue = false, IsRequired = true)]
    16    public bool Closed
    17    {
    18        get return (bool)this["close"]; }
    19        set this["closed"= value; }
    20    }

    21    [ConfigurationProperty("siteAdmin")]
    22    public SiteAdmin SiteAdmin
    23    {
    24        get return this["siteAdmin"as SiteAdmin; }
    25        set this["siteAdmin"= value; }
    26    }

    27    [ConfigurationProperty("siteUsers")]
    28    public SiteUsers SiteUsers
    29    {
    30        get return this["siteUsers"as SiteUsers; }
    31    }

    32}
    完成上面的步骤后,就可以在web.config里注册相应的节了。如
     1<configSections>
     2    <section name="siteSetting" type="SiteSetting"/>
     3  </configSections>
     4  <siteSetting siteName="McJeremy的测试" siteVersion="1.0" closed="false">
     5      <siteAdmin adminId="11" adminName="McJeremy" />
     6      <siteUsers>
     7          <siteUser userId="1" userName="McJeremy" />
     8          <siteUser userId="2" userName="McJeremy3" />
     9          <siteUser userId="5" userName="McJeremy4" />
    10      </siteUsers>
    11  </siteSetting>
    为siteUsers节点添加一个子节点:
    1 Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
    2        SiteSetting myset = config.GetSection("siteSetting"as SiteSetting;
    3        SiteUser user = new SiteUser();
    4        user.UserName = "McJeremy4";
    5        user.UserId = 5;
    6        myset.SiteUsers.Add(user);
    7       // myset.SiteUsers.Remove(6); 删除子节点
    8        config.Save();
    9        addMySettingsResult.Text = "添加成功";
    读取siteSettings下的设置:
     1 Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
     2        SiteSetting myset = config.GetSection("siteSetting"as SiteSetting;
     3        string msgs = "";
     4        msgs += "<br />站点信息是:" + myset.SiteName + ",站点版本:" + myset.SiteVersion ;
     5        SiteAdmin admin = myset.SiteAdmin;
     6        msgs += "<br />管理员名:" + admin.AdminName;
     7        msgs += "<br />用户信息:";
     8        SiteUsers users = myset.SiteUsers;
     9        foreach(SiteUser user in users)
    10        {
    11            msgs+="&nbsp;&nbsp;<br />用户名:"+user.UserName+",用户ID:"+user.UserId.ToString();
    12        }

    13        readMySettingResult.Text = msgs;
  • 相关阅读:
    docker log
    byte转String防止乱码
    SQL索引
    Redis 总结精讲
    如何保证消息队列是高可用的
    消息中间件(一)MQ详解及四大MQ比较
    @Bean和@Componet区别
    理解Spring的AOP和Ioc/DI就这么简单
    SpringBoot 基础
    《Linux 鸟哥私房菜》 第6章 Linux的文件权限与目录配置
  • 原文地址:https://www.cnblogs.com/McJeremy/p/1217501.html
Copyright © 2020-2023  润新知