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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM