zoukankan      html  css  js  c++  java
  • configSections 自定义 配置节 分离 学习 实例 源码 lcs

    configSections 自定义 配置节 学习  实例

    .aspx.cs

    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //LcsCopyright 配置节

            LCS.Configration.Copyright data;
            //data = System.Configuration.ConfigurationSettings.GetConfig("LcsCopyright") as LCS.Configration.Copyright;//已过时
            data = System.Configuration.ConfigurationManager.GetSection("LcsCopyright") as LCS.Configration.Copyright;//得到配置节的数据

            Response.Write(data.AppName);
            Response.Write(data.AppVer);
            // 输出
            // Lcs Configration Test 1.0 bate


            Response.Write("<hr/>");
            //LcsAppConfig 配置节

            //载入配置节    这句话可以放在 Global.asax 的 Application_Start 中实现
            System.Configuration.ConfigurationSettings.GetConfig("LcsAppConfig");
            Response.Write(LCS.Configration.AppConfig.ConnectionString);
            Response.Write(LCS.Configration.AppConfig.UserCount);
            //输出
            // this is a ConnectionString199
        }
    }

    web.config

    <?xml version="1.0" encoding="utf-8"?>

    <configuration>
       
        <configSections>
            <section name="LcsCopyright" type="LCS.Configration.Settings" /><!--若有生成的dll名称,则后面还要加上,dll程序集名称-->
            <section name="LcsAppConfig" type="LCS.Configration.AppConfig" /><!--这里实验直接放在App_Code里面了,所有不用写程序集名称-->
        </configSections>
       
        <LcsCopyright>
            <AppName> Lcs Configration Test</AppName>
            <AppVer> 1.0 bate</AppVer>
            <AppAuthor> Lcskey</AppAuthor>
        </LcsCopyright>
        <LcsAppConfig>
            <add key="ConnectionString" value="this is a ConnectionString" />
            <add key="UserCount" value="199" />
        </LcsAppConfig>
       
    </configuration>


    .cs
    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Xml;

    namespace LCS.Configration
    {
        public class Settings : System.Configuration.IConfigurationSectionHandler
        {
            /// <summary>
            /// 实现该接口的Create方法
            /// ConfigurationSettings.GetConfig("")方法会自动调用此方法 给相应的实体属性赋值
            /// </summary>
            /// <param name="parent"></param>
            /// <param name="input"></param>
            /// <param name="node"></param>
            /// <returns></returns>
            public object Create(object parent, object input, XmlNode node)
            {
                Copyright data = new Copyright();
                foreach (XmlNode xn in node.ChildNodes)
                {
                    switch (xn.Name.ToLower())
                    {
                        case ("appname"):
                            data.AppName = xn.InnerText;
                            break;
                        case ("appver"):
                            data.AppVer = xn.InnerText;
                            break;
                        case ("appauthor"):
                            data.AppAuthor = xn.InnerText;
                            break;
                    }
                }
                return data;
            }
        }

        /// <summary>
        /// 从配置节中读取的版权配置节信息对应实体
        /// </summary>
        public class Copyright
        {
            public string AppName;
            public string AppVer;
            public string AppAuthor;
        }






        /// <summary>
        /// 我们把所有的配置都映射成相应的静态成员变量
        /// 并且是写成只读属性
        /// 这样程序通过类似
        /// AppConfig.ConnectionString
        /// 就可以访问配置文件中的项目了
        /// 读取之前需要调用
        /// System.Configuration.ConfigurationSettings.GetConfig("LcsAppConfig");
        /// 调用自己实现了IConfigurationSectionHandler接口的AppConfig来读取配置
        /// </summary>
        public class AppConfig : System.Configuration.IConfigurationSectionHandler
        {
            static String m_connectionString = String.Empty;
            static Int32 m_userCount = 0;
            public static String ConnectionString
            {
                get
                {
                    return m_connectionString;
                }
            }
            public static Int32 UserCount
            {
                get
                {
                    return m_userCount;
                }
            }

            static String ReadSetting(System.Collections.Specialized.NameValueCollection nvc, String key, String defaultValue)
            {
                String theValue = nvc[key];
                if (theValue == String.Empty)
                    return defaultValue;

                return theValue;
            }

            public object Create(object parent, object configContext, XmlNode section)
            {
                System.Collections.Specialized.NameValueCollection settings;

                try
                {
                    System.Configuration.NameValueSectionHandler baseHandler = new System.Configuration.NameValueSectionHandler();
                    settings = (System.Collections.Specialized.NameValueCollection)baseHandler.Create(parent, configContext, section);
                }
                catch
                {
                    settings = null;
                }

                if (settings != null)
                {
                    m_connectionString = AppConfig.ReadSetting(settings, "ConnectionString", String.Empty);
                    m_userCount = Convert.ToInt32(AppConfig.ReadSetting(settings, "UserCount", "0"));
                }

                return settings;
            }
        }
    }


    分离配置节
    web.config
    <?xml version="1.0" encoding="utf-8"?>

    <configuration>
       
        <configSections>
            <section name="LcsCopyright" type="LCS.Configration.Settings"/><!--若有生成的dll名称,则后面还要加上,dll程序集名称-->
            <section name="LcsAppConfig" type="LCS.Configration.AppConfig" restartOnExternalChanges="true" /><!--这里实验直接放在App_Code里面了,所有不用写程序集名称-->
        </configSections>
       
       
        <!--<LcsCopyright>
            <AppName> Lcs Configration Test</AppName>
            <AppVer> 1.0 bate</AppVer>
            <AppAuthor> Lcskey</AppAuthor>
        </LcsCopyright>-->

        <!--<LcsAppConfig>
            <add key="ConnectionString" value="this is a ConnectionString" />
            <add key="UserCount" value="199" />
        </LcsAppConfig>-->
       
       
       
        <appSettings configSource="app.config" />
        <connectionStrings configSource="conn.config" />
       

        <!--将自定义的配置节分离出去-->
        <LcsCopyright configSource="LcsCopyright.config" />
        <LcsAppConfig configSource="LcsAppConfig.config"/>
       
    </configuration>


    app.config
    <appSettings>
    <add key="a" value="changed by application runtime" />
    </appSettings>

    conn.config
    <connectionStrings>
        <add name="c" connectionString="dbconnention....123" />
    </connectionStrings>

    LcsCopyright.config
    <?xml version="1.0" encoding="utf-8"?>

    <LcsCopyright>
        <AppName> Lcs Configration Test</AppName>
        <AppVer> 1.0 bate</AppVer>
        <AppAuthor> Lcskey</AppAuthor>
    </LcsCopyright>

    LcsAppConfig.config
    <?xml version="1.0" encoding="utf-8"?>
    <LcsAppConfig>
        <add key="ConnectionString" value="this is a ConnectionString" />
        <add key="UserCount" value="199" />
    </LcsAppConfig>

    修改web.config.添加上述文件,在同一个目录下面
    再运行程序看看,效果一样,数据全部都能读取到。
    .aspx 还是原来的,没动代码
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            //LcsCopyright 配置节

            LCS.Configration.Copyright data = new LCS.Configration.Copyright();
            //data = System.Configuration.ConfigurationSettings.GetConfig("LcsCopyright") as LCS.Configration.Copyright;//已过时
            data = System.Configuration.ConfigurationManager.GetSection("LcsCopyright") as LCS.Configration.Copyright;//得到配置节的数据

            Response.Write(data.AppName);
            Response.Write(data.AppVer);
            // 输出
            // Lcs Configration Test 1.0 bate


            Response.Write("<hr/>");
            //LcsAppConfig 配置节

            //载入配置节    这句话可以放在 Global.asax 的 Application_Start 中实现
            System.Configuration.ConfigurationSettings.GetConfig("LcsAppConfig");
            Response.Write(LCS.Configration.AppConfig.ConnectionString);
            Response.Write(LCS.Configration.AppConfig.UserCount);
            //输出
            // this is a ConnectionString199



            //分解web.config
            Response.Write("<hr/>");


            //appSettings 配置节
            Response.Write(System.Configuration.ConfigurationManager.AppSettings["a"]);
            Response.Write("<br/>");
            //connectionStrings 配置节
            Response.Write(System.Configuration.ConfigurationManager.ConnectionStrings["c"]);


            //修改appSettings配置节而不会重起应用程序
            //若需要重起,可设置配置节的 restartOnExternalChanges 属性
            System.Configuration.Configuration cfg = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
            System.Configuration.AppSettingsSection appSetting = cfg.AppSettings;
            appSetting.Settings["a"].Value = "changed by application runtime";
            cfg.Save();

        }

    }

     参考了部分园子里的文章和MSDN。现学现卖。

    以前只把app和conn分离出来过,自定义的只是想着应该可以分离,但从来都没有试过。今天小试了一下,还不错。

    能直接跑起来的实例源码

  • 相关阅读:
    新概念4-38
    新概念4-37
    新概念4-36
    新概念4-35
    国史通鉴-03 天下为私 04
    新概念4-34
    西门子 框架断路器 及其他中低压配电设备资料查询
    OPC UA 的本质
    经典Scout添加等时同步设备
    同步报故障解同步启动
  • 原文地址:https://www.cnblogs.com/luchaoshuai/p/1319109.html
Copyright © 2011-2022 走看看