2016-11-25 62 views
0

我以編程方式生成配置文件。使用ConfigurationManager讀取生成的配置XML字符串

Program.cs的

string config = new ConfigBuilder().GenerateConfigFile(false); 

ConfigBuilder.cs

public string GenerateConfigFile(bool isSettingEnabled) 
{ 
    return "<configuration>...</configuration>"; 
} 

結果

<configuration> 
    <appSettings> 
    <add key="IsSettingEnabled" value="false" /> 
    </appSettings> 
</configuration> 

使用someth就像ConfigurationManager一樣,我希望能夠從配置變量中讀取設置,而無需先將文件寫入磁盤。換句話說,可以這樣做:

ConfigurationManager.OpenFromMemory(config); 
var isSettingEnabled = ConfigurationManager.AppSettings["IsSettingEnabled"]; 

但是,似乎ConfigurationManager只能處理文件。

是否有一種簡單的方法來解釋配置,而無需自己解析XML?

+0

如果你只打算保留在內存中生成的配置文件,那麼爲什麼不只是維持簡單解釋代替?或者,你最終想把這個配置文件寫到磁盤的下面? – Jinish

+0

發生的事情比我所展示的還多。我只是試圖保持清晰的例子,並專注於這個問題:我可以讀取一個字符串iso文件的配置嗎? – Aetherix

+0

對。無論如何,這是不可能的。 ConfigurationManager類本身不讀取配置。我們使用不同的方法(OpenExeConfiguration,OpenMappedConfiguration等)獲得的文件路徑被Configuration類從文件路徑中讀取物理文件。所以,你不可能在內存流中進行配置或者使用ConfigurationManager讀取它。如果您打算使用ConfigurationManager類,則最終必須將其保存到磁盤 – Jinish

回答

1

我不相信你可以做到這一點,所以我所做的就是創建一個IDisposable包裝類,它將配置數據存儲在磁盤上的臨時文件中,並在包裝​​類處理時進行清理。

它看起來像這樣:

sealed class ConfigurationGenerator : IDisposable 
{ 
    private string _tempFileName; 

    public ConfigurationGenerator(string configurationData) 
    { 
     if (String.IsNullOrEmpty(configurationData)) throw new ArgumentNullException("configurationData"); 
     _tempFileName = Path.GetTempFileName(); 
     File.WriteAllText(_tempFileName, configurationData); 
    } 

    public System.Configuration.Configuration Generate() 
    { 
     var filemap = new ExeConfigurationFileMap 
     { 
      ExeConfigFilename = _tempFileName 
     }; 
     var config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(filemap, ConfigurationUserLevel.None); 
     return config; 
    } 

    public void Dispose() 
    { 
     if (_tempFileName != null) 
     { 
      string s = _tempFileName; 
      _tempFileName = null; 
      File.Delete(s); 
     } 
    } 
} 

並且你使用這樣的:

using(var configGenerator = new ConfigurationGenerator(configData)) 
{ 
    Configuration configuration = configGenerator.Generate(); 

    ... use the configuration data here ... 
} 
+0

應該是「使用(var configGenerator =新的ConfigurationGenerator(configData)) –

+0

@TommyOvesen謝謝,糾正。 – Joe