zoukankan      html  css  js  c++  java
  • web.config的configSections节点

    configSections关联的类型在一个进程内只实例化一次。

    1、配置文件Web.config

    <?xml version="1.0" encoding="utf-8" ?> 
    <configuration>
        <configSections>
            <section name="flyLogger" type="Fly.Lib.LoggerSectionHandler,DAL.Test1"/><!--注:DAL.Test1是程序集名-->
        </configSections>
        <flyLogger>
            <add name="file" maxSize="5mb"/>
            <add name="test" sendFlag="false"/>
        </flyLogger>
    </configuration>
    View Code

     

    2、关联的类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections;
    using System.Configuration;
    using System.Xml;
    
    namespace Fly.Lib
    {
        //配置聚合根
        public class LoggerConfiguration
        {
            //此测试用于存储配置数据的集合
            private Hashtable myRegionConfig = new Hashtable();
            public Hashtable MyRegionConfig
            {
                get { return myRegionConfig; }
            }
    
            //获取配置聚合根对象
            public static LoggerConfiguration GetConfig()
            {
                //ConfigurationSettings.GetConfig已过时,使用System.Configuration.ConfigurationManager。
                //首次ConfigurationManager.GetSection("flyLogger")时,将调用LoggerSectionHandler获得对象,后续则直接返回对象。
                return (LoggerConfiguration)System.Configuration.ConfigurationManager.GetSection("flyLogger");
            }
    
            //加载配置信息,将信息写入集合
            internal void LoadValuesFrom(XmlNode xmlNode)
            {
                foreach (XmlNode item in xmlNode.ChildNodes)
                {
                    myRegionConfig.Add(item.Attributes[0].Value, item.Attributes[1].Value);
                }
            }
        }
    
        //HttpHandler初始化配置(一个进程只初始化一次)。
        internal class LoggerSectionHandler : IConfigurationSectionHandler
        {
            //该方法只被调用一次(在ConfigurationManager.GetSection("flyLogger")首次调用时该方法被调用)。
            public object Create(object parent, object configContext, System.Xml.XmlNode section)
            {
                //初始化配置信息
                LoggerConfiguration loggerConfiguration = new LoggerConfiguration();
                loggerConfiguration.LoadValuesFrom(section);
                return loggerConfiguration;
            }
        }
    }
    View Code


    3、测试

    using System;
    using System.Text;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using Fly.Lib;
    
    namespace DAL.Test1
    {
        [TestClass]
        public class ConfigSectionTest
        {
            [TestMethod]
            public void TestMethod1()
            {
                var hashtb = LoggerConfiguration.GetConfig().MyRegionConfig;
                foreach (var item in hashtb.Keys)
                {
                    Console.WriteLine(string.Format("key={0},value={1}", item, hashtb[item]));
                }
            }
        }
    }
    View Code

    小小技巧,可发挥无穷威力!

    有了它,更方便创建自己的插件哦!

    2016/5/19新:

    1Web.Config

    <?xml version="1.0" encoding="utf-8"?>
    <!--
      有关如何配置 ASP.NET 应用程序的详细消息,请访问
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
      <configSections>
        <section name="webConfig" type="xcyOA.Models.WebConfigSectionHandler,xcyOA"/>
      </configSections>
      <webConfig>
        <add name="Attr1" value="889" type="int"/>
        <add name="Attr2" value="150" type="string"/>
        <add name="Attr3" value="false" type="bool"/>
        <add name="Attr4" value="1,3,5,6,7" type="list_int"/>
        <add name="Attr5" value="金戒指,铜戒指" type="list_string"/>
        <add name="UserInfo" value="/Config/UserInfo.xml" type="xcyOA.Models.UserInfo"/>
        <add name="UserInfos" value="/Config/UserInfos.xml" type="list,xcyOA.Models.UserInfo"/>
      </webConfig>
    </configuration>
    View Code

    2C#

    /// <summary>
        /// Author:Fly 
        /// Date:2016/05/19
        /// </summary>
        public class WebConfigSectionHandler : IConfigurationSectionHandler
        {
            public object Create(object parent, object configContext, System.Xml.XmlNode section)
            {
                return WebConfig.Init(section);
            }
        }
    
     /// <summary>
        /// Author:Fly 
        /// Date:2016/05/19
        /// </summary>
        public partial class WebConfig
        {
            static WebConfig()
            {
                System.Configuration.ConfigurationManager.GetSection("webConfig");
            }
    
            internal static object Init(XmlNode xmlNode)
            {
                foreach (XmlNode item in xmlNode.ChildNodes)
                {
                    var name = item.Attributes["name"].Value;
                    var valAttr = item.Attributes["value"];
                    var type = item.Attributes["type"];
                    Object val = valAttr.Value;//string
                    if (type != null && valAttr != null && val != null)
                    {
                        switch (type.Value)
                        {
                            case "int":
                                val = Convert.ToInt32(val);//int
                                break;
                            case "bool":
                                val = Convert.ToBoolean(val);//bool
                                break;
                            case "list_int"://List<int>
                                val = val.ToString().Split(',').Select(m => Convert.ToInt32(m)).ToList<int>();
                                break;
                            case "list_string"://List<string>
                                val = val.ToString().Split(',').Select(m => m).ToList<string>();
                                break;
                            case "string":
                                break;
                            default://对象、泛型集合
                                Type objType;
                                if (type.Value.Contains("list,"))
                                {
                                    //泛型集合
                                    var clsTypeStr = type.Value.Replace("list,", "");
                                    objType = Type.GetType(clsTypeStr);
                                    objType = typeof(List<>).MakeGenericType(objType);
                                }
                                else
                                {
                                    //对象
                                    objType = Type.GetType(type.Value);
                                }
                                var path = Path.Combine(Directory.GetCurrentDirectory(), "../" + val.ToString());
                                val = Serialize(objType, path);
                                break;
                        }
                    }
                    var prop = typeof(WebConfig).GetProperty(name);
                    prop.SetValue(typeof(WebConfig), val, null);
                }
                return typeof(WebConfig);
            }
    
            private static object Serialize(Type type, string filename)
            {
                FileStream fs = null;
                try
                {
                    fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                    XmlSerializer serializer = new XmlSerializer(type);
                    return serializer.Deserialize(fs);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (fs != null)
                        fs.Close();
                }
            }
        }
    
        /// <summary>
        /// Author:Fly 
        /// Date:2016/05/19
        /// </summary>
        public partial class WebConfig
        {
            public static int Attr1 { get; set; }
            public static string Attr2 { get; set; }
            public static bool Attr3 { get; set; }
            public static IList<int> Attr4 { set; get; }
            public static IList<string> Attr5 { set; get; }
            public static UserInfo UserInfo { get; set; }
            public static IList<UserInfo> UserInfos { get; set; }
        }
    
        public class WebConfigTest
        {
            public void MyTestMethod()
            {
                Console.WriteLine(WebConfig.Attr1);
                Console.WriteLine(WebConfig.Attr2);
                Console.WriteLine(WebConfig.Attr3);
                Console.WriteLine(JSONhelper.ToJson(WebConfig.Attr4));
                Console.WriteLine(JSONhelper.ToJson(WebConfig.Attr5));
                Console.WriteLine(JSONhelper.ToJson(WebConfig.UserInfo));
                Console.WriteLine(JSONhelper.ToJson(WebConfig.UserInfos));
            }
        }
    
    
        public class UserInfo
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
            public List<string> Features { get; set; }
            public UserInfoEx UInfoEx { get; set; }
            public List<UserInfoEx> UInfoExs { get; set; }
        }
    
        public class UserInfoEx
        {
            public string Var1 { get; set; }
            public string Var2 { get; set; }
        }
    View Code

    Test:

        public class WebConfigTest
        {
            public void MyTestMethod()
            {
                Console.WriteLine(WebConfig.Attr1);
                Console.WriteLine(WebConfig.Attr2);
                Console.WriteLine(WebConfig.Attr3);
                Console.WriteLine(JSONhelper.ToJson(WebConfig.Attr4));
                Console.WriteLine(JSONhelper.ToJson(WebConfig.Attr5));
                Console.WriteLine(JSONhelper.ToJson(WebConfig.UserInfo));
                Console.WriteLine(JSONhelper.ToJson(WebConfig.UserInfos));
            }
    
            public void MyTestMethod2()
            {
                List<UserInfo> users = new List<UserInfo>();
                users.Add(new UserInfo { Id = 555 });
                users.Add(new UserInfo { Id = 666 });
                users.Add(new UserInfo { Id = 777 });
                users.Add(new UserInfo { Id = 888 });
    
                var fs = new FileStream("D:/test.xml", FileMode.Create);
                XmlSerializer serializer = new XmlSerializer(typeof(List<UserInfo>));
                serializer.Serialize(fs, users);
                fs.Close();
            }
        }
    View Code

    3xml

    /Config/UseInfo.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <UserInfo>
      <Id>15</Id>
      <Name>李四</Name>
      <Age>25</Age>
      <UInfoEx>
        <Var1>子对象属性1。</Var1>
      </UInfoEx>
      <UInfoExs>
        <UserInfoEx>
          <Var1>1子对象集合属性1。</Var1>
        </UserInfoEx>
        <UserInfoEx>
          <Var1>2子对象集合属性1。</Var1>
          <Var2>2子对象集合属性2。</Var2>
        </UserInfoEx>
        <UserInfoEx>
          <Var1>3子对象集合属性1。</Var1>
        </UserInfoEx>
      </UInfoExs>
    </UserInfo>
    View Code

    /Config/UseInfos.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <ArrayOfUserInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <UserInfo>
        <Id>555</Id>
        <Age>0</Age>
      </UserInfo>
      <UserInfo>
        <Id>666</Id>
        <Age>0</Age>
      </UserInfo>
      <UserInfo>
        <Id>777</Id>
        <Age>0</Age>
      </UserInfo>
      <UserInfo>
        <Id>888</Id>
        <Age>0</Age>
      </UserInfo>
    </ArrayOfUserInfo>
    View Code

     源码地址:微云/OpenSource/SectionTest.rar

  • 相关阅读:
    script标签加载顺序(defer & async)
    nginx反向代理vue访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题
    Git每次进入都需要输入用户名和密码的问题解决
    update select
    sql --- where concat
    GO -- 正则表达式
    浏览器中回车(Enter)和刷新的区别是什么?[转载]
    转: Linux --- Supervisor的作用与配置
    Golang 使用Map构建Set类型的实现方法
    linux -- 查看应用启动时间
  • 原文地址:https://www.cnblogs.com/ToughGuy/p/3485984.html
Copyright © 2011-2022 走看看