2012-02-14 9 views
7

Tengo dificultades para leer un app.config con ConfigurationManager. Tengo una sección personalizada, que usa una ConfigurationElementCollection.La lectura de secciones de configuración personalizada devuelve "Valor clave no válido"

Mi (corte hacia abajo) 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> 

Mis clases de configuración:

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() 
    { 

    } 
} 

intentar utilizarlo:

[TestMethod] 
    public void TestConfigReader() 
    { 
     var searchSection = (SearchWeightSection)ConfigurationManager.GetSection("CustomerMatching/SearchWeight"); 
     Assert.AreEqual(searchSection.SearchMethods["ByContactName"].Weight, "100"); 
    } 

Mi 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 

Gracias.

+0

Echa un vistazo a esto: https://stackoverflow.com/questions/43037691/design-to-implement-a-wrapper-for-configurationsection-net-class Esto funciona –

Respuesta

13

Su código se ve absolutamente bien, aparte del elemento de configuración Method en sí.

Dado que es un elemento de configuración, las propiedades necesitan almacenar los datos en la colección de valores de nombre de la clase base '(ConfigurationElement). De lo contrario, la clave y el valor no se inicializarán.

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 
} 

Espero que ayude.

+0

Fantástico, que funcionó a la perfección. –

Cuestiones relacionadas