zoukankan      html  css  js  c++  java
  • YZR.Data webconfig端的配置

    这里记录一下,YZR.Data对系统兼容数据库在webconfig的配置处理.

    <?xml version="1.0" encoding="utf-8"?>
    
    <!--
      有关如何配置 ASP.NET 应用程序的详细信息,请访问
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    
    <configuration>
      <configSections>
        <section name="YZRSetting" type="YZR.Config.YZRSetting, YZR.Config" />
      </configSections>
    
      <connectionStrings>
        <add name="connString" connectionString="Data Source=127.0.0.1/orcl;Persist Security Info=True;User ID=YZR;Password=677714" providerName="YZROracle"/>
      </connectionStrings>
      <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
      </system.web>
      <YZRSetting>
        <base title="巴夫&amp;巴夫" subTitle="YZR的博客" url="http://www.cnblogs.com/Francis_YZR"></base>
        <strConn>
          <!--<file name="headPhoto" path="upload/image/headPhoto" size="200"></file>
          <file name="album" path="upload/image/album" size="1024"></file>-->
          <conn Rname="Oracle" Rvalue="YZROracle"></conn>
          <conn Rname="Sqlserver" Rvalue="YZRSqlserver"></conn>
        </strConn>
      </YZRSetting>
    </configuration>

    一开始的时候,我的做法是在appStart.cs中通过配置"RAtion"或者"RMtion"来决定采用Oracle,还是Sqlserver,但这样并不明智,因为需要改动项目代码,所以,我就想把决定数据库驱动的时机转移webconfig.通过providerName来指定数据库驱动.

    如下:

    <connectionStrings>
        <add name="connString" 
    connectionString
    ="Data Source=127.0.0.1/orcl;Persist Security Info=True;User ID=YZR;Password=677714"
    providerName
    ="YZROracle"/> </connectionStrings>

    然后,providerName提供出来之后,并未知道其有多少选择值,而且我希望也把它也配置起来,可以实现手动配置和任意添加删除,所以,我在wenconfig文件中加了自定义节点.

    如下:

    <YZRSetting>
        <base title="巴夫&amp;巴夫" subTitle="YZR的博客" url="http://www.cnblogs.com/Francis_YZR"></base>
        <strConn>
          <!--<file name="headPhoto" path="upload/image/headPhoto" size="200"></file>
          <file name="album" path="upload/image/album" size="1024"></file>-->
          <conn Rname="Oracle" Rvalue="YZROracle"></conn>
          <conn Rname="Sqlserver" Rvalue="YZRSqlserver"></conn>
        </strConn>
      </YZRSetting>

    这样的目的很明确,就是providerName的值是通过Rvalue决定的.

    下面贴上YZRSetting.cs

    namespace YZR.Config  //好好研究一下ConfigurationSection
    {
        using System.Configuration;
        public class YZRSetting : ConfigurationSection
        {
            //base节点
            [ConfigurationProperty("base")]
            public baseSection BaseSetting { get { return (baseSection)base["base"]; } }
    
            //fileUpload节点
            [ConfigurationProperty("strConn")]
            public strConnSection StrConnSetting { get { return (strConnSection)base["strConn"]; } }
        }
    
        public class baseSection : ConfigurationElement
        {
            //title属性
            [ConfigurationProperty("title", IsKey = true, IsRequired = true)]
            public string title { get { return (string)base["title"]; } set { title = value; } }
            //subTitle属性
            [ConfigurationProperty("subTitle", IsRequired = false, DefaultValue = "")]
            public string subTitle { get { return (string)base["subTitle"]; } set { subTitle = value; } }
            //url属性
            [ConfigurationProperty("url", IsRequired = true)]
            public string url { get { return (string)base["url"]; } set { url = value; } }
        }
    
        [ConfigurationCollection(typeof(connSection), AddItemName = "conn")]//子元素的声明conn
        public class strConnSection : ConfigurationElementCollection
        {
            protected override ConfigurationElement CreateNewElement()
            {
                return new connSection();
            }
    
            protected override object GetElementKey(ConfigurationElement element)
            {
                return ((connSection)element).Rname;
            }
    
            public connSection this[int index]
            {
                get { return (connSection)base.BaseGet(index); }
            }
    
            new public connSection this[string name]
            {
                get { return (connSection)base.BaseGet(name); }
            }
        }
    
        public class connSection : ConfigurationElement
        {
            //name属性
            [ConfigurationProperty("Rname", IsKey = true, IsRequired = true)]
            public string Rname { get { return (string)this["Rname"]; } set { Rname = value; } }
            //value属性
            [ConfigurationProperty("Rvalue", IsRequired = true)]
            public string Rvalue { get { return (string)this["Rvalue"]; } set { Rvalue = value; } }
            ////path属性
            //[ConfigurationProperty("path", IsRequired = true)]
            //public string path { get { return (string)this["path"]; } set { path = value; } }
            ////size属性
            //[ConfigurationProperty("size", IsRequired = true, DefaultValue = 1024)]
            //public int size { get { return (int)this["size"]; } set { size = value; } }
        }
    
        public class WebSettingManager
        {
            public static YZRSetting WebSetting = (YZRSetting)System.Configuration.ConfigurationManager.GetSection("YZRSetting");
        }
        /*
         * 
         *      WebSettingManager.WebSetting.BaseSetting.title + " - " + WebSettingManager.WebSetting.BaseSetting.subTitle;
                WebSettingManager.WebSetting.BaseSetting.title;
                WebSettingManager.WebSetting.BaseSetting.subTitle;
                WebSettingManager.WebSetting.BaseSetting.url;
    
                WebSettingManager.WebSetting.strConnSetting;//数组的形式
         */
    }

    在appStart.cs的处理如下:

                string Title = WebSettingManager.WebSetting.BaseSetting.title + " - " + WebSettingManager.WebSetting.BaseSetting.subTitle;
                int count = WebSettingManager.WebSetting.StrConnSetting.Count;
                List<string> list = new List<string>();
                for (int i = 0; i < count; i++)
                {
                    connSection section=WebSettingManager.WebSetting.StrConnSetting[i];
                    list.Add(section.Rvalue);
                }
                //string strConn = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["default"].ConnectionString;
                //string connString = System.Configuration.ConfigurationManager.ConnectionStrings["connString"].ToString();
                string ProviderName = System.Configuration.ConfigurationManager.ConnectionStrings["connString"].ProviderName;
                string path = AppDomain.CurrentDomain.BaseDirectory;
                Assembly ass = Assembly.LoadFrom(path + "bin\YZR.Data.dll");
                //Assembly ass = Assembly.Load("YZR.Entity");
                //TODO:Oracle数据库使用RAtion,Sqlserver使用RMotion
                Type type = null;
                for (int i = 0; i < list.Count; i++)
                {
                    if (list[i].Equals(ProviderName, StringComparison.OrdinalIgnoreCase))
                    {
                        type = ass.GetType("YZR.Data." + "RAction");
                        break;
                    }
                    if (list[i].Equals(ProviderName, StringComparison.OrdinalIgnoreCase))
                    {
                        type = ass.GetType("YZR.Data." + "RMotion");
                        break;
                    }
                    else
                        throw new Exception("配置节点出错");
                }

    END!

  • 相关阅读:
    DOM事件模型
    值类型和引用类型的区别
    CSS盒模型
    reflow和repaint
    CSS优化
    跨域的几种方法
    快速排序
    vs2017开发ActiveX(主讲OCX)(五)、事件
    vs2017开发ActiveX(主讲OCX)(四)、绘制ActiveX控件
    vs2017开发ActiveX(主讲OCX)(三)、MFC ActiveX控件向导中的控件设置
  • 原文地址:https://www.cnblogs.com/Francis-YZR/p/4955616.html
Copyright © 2011-2022 走看看