我在一個環境中使用EntLib,在該環境中,數據庫連接字符串是從解密專有配置文件的單獨庫調用中檢索的。我沒有說過這種做法或配置文件的格式。將運行時創建的部分配置與系統配置合併
我想在此設置中執行EntLib異常日誌記錄到數據庫。因此,我需要使用連接字符串來設置一個帶有數據庫名稱的EntLib數據庫配置實例。既然不能得到連接字符串,直到運行時間,但EntLib確實允許運行時配置,我用下面的代碼,如this描述:
builder.ConfigureData()
.ForDatabaseNamed("Ann")
.ThatIs.ASqlDatabase()
.WithConnectionString(connectionString)
.AsDefault();
參數connectionString
是我所檢索到的一個從單獨的圖書館。
示例代碼繼續將創建的配置信息與空的DictionaryConfigurationSource合併。但是,我需要將它與app.config中的其餘配置代碼合併。所以我這樣做:
var configSource = new SystemConfigurationSource();
builder.UpdateConfigurationWithReplace(configSource);
EnterpriseLibraryContainer.Current
= EnterpriseLibraryContainer.CreateDefaultContainer(configSource);
...這是基於非常接近的示例代碼。
但是:我在Microsoft.Practices.EnterpriseLibrary.Common.Configuration.SystemConfigurationSource.Save中出現內部錯誤。失敗的代碼是這樣的:
var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = ConfigurationFilePath };
var config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
config.Sections.Remove(section);
config.Sections.Add(section, configurationSection);
config.Save();
...其中'節'是「connectionStrings」。該代碼在Add方法調用中失敗,表示您無法添加重複節。檢查顯示,即使在刪除之後,connectionStrings部分仍然存在。
我從經驗中知道,總會有下的ConnectionStrings當配置文件實際上閱讀和解釋,從machine.config中繼承了一個默認項。所以也許你永遠不會真的刪除connectionStrings部分。
雖然這似乎讓我失去了運氣,但是,除非我想修改EntLib源,我不這樣做。
我可以使用流利的API在運行時爲EntLib構建所有配置信息。但我寧願不。用戶希望他們的操作人員能夠對日誌進行小的更改,而無需涉及開發人員。
所以我的問題,在幾個部分:是否有一個很好的簡單的解決方法呢?它是否需要更改EntLib源?還是我錯過了一些非常簡單的事情,可以消除這個問題?
您已經嘗試了清除在配置文件的connectionStrings節? – podiluska 2012-07-30 19:59:22
另外,如果您在進行日誌記錄時知道連接字符串,那麼在初始化日誌記錄組件時是否可以不直接設置它,而不是更新配置? – podiluska 2012-07-30 20:02:32
@podiluska - 是的,我試過一個清除。它沒有任何區別。 – 2012-07-30 20:05:37