2016-11-25 67 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

相关问题