1

我想在当前项目中使用EntLib 4.1,特别是Unity 1.2和VAB。我的应用程序是一个SaaS应用程序,因此我决定将租户特定的配置文件存储在数据库中,以便在租户登录时加载。这些文件包括VAB配置和Unity配置,以及其他租户特定的设置。从内存中的XML字符串读取EntLib 4.1配置

我找不到任何实际的方法来简单地使用XML字符串作为VAB的配置信息。

我首先想到我必须创建IConfigurationSource的自定义实现,但后来我意识到我将不得不复制已存在于FileConfigurationSource类中的解析逻辑。

接下来的想法是,我可以创建一个派生自FileConfigurationSource的新类,并且只是使用新类作为代理来传递配置信息,而不是使用文件路径传递字符串,但是我看不到如何覆盖文件加载的地方。

我检出了SqlConfigurationSource QuickStart示例,但这又不是我认为我需要的东西。

回答

2

这里是我想出了一个解决方案来解决这个问题:

我创建了一个新的类,XmlConfigurationSource,从IConfigurationSource得出:

public class XmlConfigurationSource : IConfigurationSource 
    { 
     private string _xml; 

     public XmlConfigurationSource(string xml) 
     { 
      _xml = xml; 
     } 
     //Other IconfigurationSource members omitted for clarity. 
     //Also, I'm not using them so I didn't implement them 

     public ConfigurationSection GetSection(string sectionName) 
     { 
      //Since my solution is specific to validation, I'm filtering for that here. 
      //This could easily be refactored for other EntLib blocks 
      //SerializableConfigurationSection object instead of XmlValidatorSettings 
      if (sectionName != "validation") 
       return null; 

      XmlValidatorSettings x = new XmlValidatorSettings(_xml.ToString()); 

      return x;    
     } 
    } 

的XmlValidatorSettings类是排序的关键得到这个工作。这是一个非常简单的类从ValidationSettings派生:

public class XmlValidatorSettings : ValidationSettings 
    { 
     public XmlValidatorSettings(string configXml) 
     { 
      XDocument doc = XDocument.Parse(configXml); 
      DeserializeSection(doc.CreateReader()); 
     } 
    } 

若要使用此代码,您需要引用EntLib常见和验证DLL的。希望其他人从中受益!

+0

我无法量化这多少时间救了我!谢谢。 – SergioL 2014-01-22 21:02:46