从内存中的XML字符串中读取EntLib 4.1配置

时间:2009-12-09 17:52:18

标签: configuration unity-container enterprise-library validation-application-bl

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

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

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

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

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

1 个答案:

答案 0 :(得分: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。希望其他人从中受益!