zoukankan      html  css  js  c++  java
  • C#项目中关于多个程序集下App.config文件的问题

    在项目中我们会经常用到App.config文件,有的是自动生成的,比如引用webservice、wcf服务时生成;也有手动建立的配置文件直接默认名就为app.config。
    这些配置有的保存当前程序集用到的一些可供外部改动的变量,比如:

    [csharp] view plain copy
     
    1. <configuration>  
    2.   <appSettings>  
    3.     <add key="keyName" value="value"/>  
    4.   </appSettings>  
    5. </configuration>  

    这种的配置直接使用 ConfigurationManager.AppSettings["key名"]来读取比较方便。例如:

    [csharp] view plain copy
     
    1. public class ReadConfig  
    2. {  
    3.     public static string ConfigKeyValue  
    4.     {  
    5.         string config = ConfigurationManager.AppSettings["ConfigKeyValue"];  
    6.   
    7.         config = string.IsNullOrEmpty(config) ? "空字符串" : config;  
    8.   
    9.         return config;  
    10.     }  
    11. }  

    有表示数据库连接的比如ADO.NET Entity连接数据时会生成配置。

    [csharp] view plain copy
     
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <configuration>  
    3.   <startup>  
    4.     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />  
    5.   </startup>  
    6.   <connectionStrings>  
    7.     <add name="OracleEntities" connectionString="" />  
    8.   </connectionStrings>  
    9. </configuration>  

    有Microsoft.Practices.EnterpriseLibrary连接数据库的配置 (http://blog.csdn.net/yysyangyangyangshan/article/details/8488791)。
    再有
    ”混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行“错误时要用的,

    [csharp] view plain copy
     
    1. <?xml version="1.0"?>  
    2. <configuration>  
    3.   <startup useLegacyV2RuntimeActivationPolicy="true">  
    4.     <supportedRuntime version="v4.0" sku = ".NETFramework,Version=v4.0"/>  
    5.     <supportedRuntime version="v2.0.50727"/>  
    6.   </startup>  
    7. </configuration>  

    等等,总之app.config作用很多。

    但是在一个项目中很多程序集都要用到app.config该怎么办呢?比如如下情况:


    FouctionDll程序集中配置:

    [csharp] view plain copy
     
    1. <?xml version="1.0" encoding="utf-8" ?>  
    2. <configuration>  
    3.   <appSettings>  
    4.     <add key="key1" value="你好,世界!"/>  
    5.   </appSettings>  
    6. </configuration>  

    主目录TestAppConfig中的配置:

    [csharp] view plain copy
     
    1. <?xml version="1.0" encoding="utf-8" ?>  
    2. <configuration>  
    3.   <appSettings>  
    4.     <add key="key2" value="Hello,world!" />  
    5.   </appSettings>  
    6. </configuration>  

    这样的情况下,如果主程序集需要引用FouctionDll,配置被复制过来由于配置名重复,自然会被主程序的配置覆盖。
    还有就是如果FouctionDll中要引用远程服务,会自动生成app.config,一旦主程序引用该配置依然无法使用。
    针对这样,应该做如下解决:
    1、第一种情况,每一个程序集的配置是手动增加的话,将起名字改变。读取方式不再使用
     ConfigurationManager.AppSettings["key"]来读取,可改为:

    [csharp] view plain copy
     
    1. public class ReadConfig  
    2.    {  
    3.        private static string currentConfig = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"ConfigName.config";  
    4.          
    5.        /// <summary>  
    6.        /// 判断是否有人操作的间隔时间  
    7.        /// </summary>  
    8.        public static string ConfigKeyValue  
    9.        {  
    10.            get  
    11.            {  
    12.                string time =GetAttributeValue(currentConfig,"ConfigKeyValue");  
    13.   
    14.                if (string.IsNullOrEmpty(time))  
    15.                {  
    16.                    return "180";  
    17.                }  
    18.   
    19.                return time;  
    20.            }  
    21.        }  
    22.        /// <summary>  
    23.        /// 获取配置文件的属性  
    24.        /// </summary>  
    25.        /// <param name="key"></param>  
    26.        /// <returns></returns>  
    27.        private static string GetAttributeValue(string file, string key)  
    28.        {  
    29.            string value = string.Empty;  
    30.   
    31.            try  
    32.            {  
    33.                if (File.Exists(file))  
    34.                {  
    35.                    XmlDocument xml = new XmlDocument();  
    36.   
    37.                    xml.Load(file);  
    38.   
    39.                    XmlNode xNode = xml.SelectSingleNode("//appSettings");  
    40.   
    41.                    XmlElement element = (XmlElement)xNode.SelectSingleNode("//add[@key='" + key + "']");  
    42.   
    43.                     value = element.GetAttribute("value").ToString();  
    44.                }  
    45.            }  
    46.            catch { }  
    47.   
    48.            return value;  
    49.        }  
    50.    }  


    这种方式的好处是让每个程序集相对独立,缺点是如果是自动生成的app.config则还是会有上述问题。那么对于需要用到的名字必须是app.config的情况该如何呢?
    可以使用超链接的方式,就是在项目中只有主程序使用app.config,其他程序集使用它的链接,这样共同使用,如图

    读取还是在当前目录下使用ConfigurationManager.AppSettings["keyName"];

    这种方式的好处是,可以解决了几个程序集共用一个app.config的问题,缺点是程序集不独立,因为引用了同一个文件,程序集在移动目录是需要重新检查再手动引用。
    总之开发软件第一目的是软件功能正常,其次是我们开发时要尽可能的使自己方便,只有更方便,效率才能提高。
    代码下载:http://download.csdn.net/detail/yysyangyangyangshan/5004721

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yysyangyangyangshan/article/details/8513735
  • 相关阅读:
    memcache 基本操作
    PHP 实现定时任务的几种方法
    PDO 事务处理
    mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by
    ASP.NET Web API 跨域访问(CORS)
    nmap使用
    买定离手,落子无悔
    html5plus处理返回键
    PAT 1008 数组元素循环右移问题
    PAT 1007 素数对猜想
  • 原文地址:https://www.cnblogs.com/net-sky/p/9231517.html
Copyright © 2011-2022 走看看