I'm having difficulties reading an app.config using the ConfigurationManager. I have a custom section, which uses a ConfigurationElementCollection.
My (cut-down) XML:
<configuration>
<configSections>
<sectionGroup name ="CustomerMatching">
<section name="SearchWeight" type="BLL.Contracts.Helpers.CustomerMatching.SearchWeightSection, BLL.Contracts"/>
</sectionGroup>
</configSections>
<CustomerMatching>
<SearchWeight>
<methods>
<method SearchMethod="ByContactName" Weight="100"/> <!--Line 53, referenced in Error -->
<method SearchMethod="ByBusinessName" Weight="250"/>
<method SearchMethod="ByPostcode" Weight="250"/>
<method SearchMethod="ByMobile" Weight="500"/>
<method SearchMethod="ByLandline" Weight="500"/>
<method SearchMethod="ByCompCharNo" Weight="850"/>
</methods>
</SearchWeight>
</CustomerMatching>
</configuration>
My Configuration classes:
public class SearchWeightSection: ConfigurationSection
{
[ConfigurationProperty("methods", IsRequired = true)]
[ConfigurationCollection(typeof(SearchMethods), AddItemName = "method", CollectionType = ConfigurationElementCollectionType.BasicMap)]
public SearchMethods SearchMethods
{
get { return (SearchMethods) base["methods"]; }
}
}
public class SearchMethods: ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new Method();
}
protected override object GetElementKey(ConfigurationElement element)
{
var method = (Method) element;
return method.SearchMethod;
}
public new Method this[string index]
{
get { return (Method)BaseGet(index); }
}
}
public class Method: ConfigurationElement
{
[ConfigurationProperty("SearchMethod", IsKey = true, IsRequired = true)]
public string SearchMethod { get; set; }
[ConfigurationProperty("Weight", IsRequired = true)]
public string Weight { get; set; }
public Method(string searchMethod, string weight)
{
SearchMethod = searchMethod;
Weight = weight;
}
public Method()
{
}
}
Trying to use it:
[TestMethod]
public void TestConfigReader()
{
var searchSection = (SearchWeightSection)ConfigurationManager.GetSection("CustomerMatching/SearchWeight");
Assert.AreEqual(searchSection.SearchMethods["ByContactName"].Weight, "100");
}
My error:
Test method BLL.UnitTests.Customer.CustomerMatchManagerTest.TestConfigReader threw exception:
System.Configuration.ConfigurationErrorsException: Invalid key value. (C:\Users\michael\Documents\Visual Studio 2010\MyProject\BLL.UnitTests\bin\Debug\BLL.UnitTests.dll.config line 53)
at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult)
at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, ref Object result, ref Object resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, ref Object result, ref Object resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, ref Object result, ref Object resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, ref Object result, ref Object resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at BLL.UnitTests.Customer.CustomerMatchManagerTest.TestConfigReader() in CustomerMatchManagerTest.cs: line 41
Thanks.
Your code looks absolutely fine, apart from the Method configuration element itself.
Since it's a configuration element, properties need to store the data in the base class' (ConfigurationElement) name value collection. Otherwise key and value will not be initialized.
public class Method: ConfigurationElement
{
[ConfigurationProperty("SearchMethod", IsKey = true, IsRequired = true)]
public string SearchMethod
{
get { return base["SearchMethod"] as string; }
set { base["SearchMethod"] = value; }
}
[ConfigurationProperty("Weight", IsRequired = true)]
public string Weight
{
get { return base["Weight"] as string; }
set { base["Weight"] = value; }
}
//REST OF YOUR CLASS
}
Hope that helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With