2009-09-15 22 views
6

Estoy convertir una aplicación Castillo/monorraíles en una unidad/MVC Asp.NET uno, estoy atascado en el intento de convertir esta configuración de componentes:Unidad: Construir un diccionario

<component 
    id="ComponentBaseConfiguration" 
    service="MyFakeNamespace.BOL.IConfiguration, MyFakeAppDll" 
    type="MyFakeNamespace.BOL.ConfigurableConfiguration, MyFakeAppDll"> 
    <parameters> 
    <!-- Setting Configuration (Dictionary<string,string>)--> 
    <Config> 
     <dictionary> 
     <entry key="localHost">#{LocalHost}</entry>    
     <entry key="contentHost">#{ContentHost}</entry> 
     <entry key="virtualDir">#{VirtualDir}</entry>    
     </dictionary> 
    </Config> 
    </parameters> 

parece que la unidad es compatible con la matriz, pero no diccionario, me gustaría hacer algo como esto:

<unity> 
<containers> 
    <container> 
     <types> 
      <type name="ComponentBaseConfiguration" type="MyFakeNamespace.BOL.IConfiguration, MyFakeAppDll" mapTo="MyFakeNamespace.BOL.ConfigurableConfiguration, MyFakeAppDll"> 
       <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement, Microsoft.Practices.Unity.Configuration"> 
        <property name="Config" propertyType="System.Collections.Generic.Dictionary`2[[System.String, mscorlib], [System.String, mscorlib]],mscorlib"> 
         <dictionary> 
          <entry key="localHost">127.0.0.1</keyedValue> 
          <entry key="contentHost">\\content</keyedValue> 
          <entry key="virtualDir">/</keyedValue> 
         </dictionary> 
        </property> 
       </typeConfig> 
      </type> 
     </types> 
    </container> 
</containers></unity> 

¿Cómo puedo lograr algo como esto?

+0

que tiene algo como esto para trabajar. ver - http://stackoverflow.com/questions/5597492/how-do-i-create-and-populate-a-dictionarystring-object-using-unitys-xml-confi/7901103#7901103 – ScArcher2

+0

Aquí está mi solución para mayores versión - que requiere algunos cambios en el código - cuando voy a tener tiempo tal vez voy a tratar de adaptarse a esa nueva vesión de la Unidad http://unity.codeplex.com/discussions/230927/ – AdaskoTheBeAsT

Respuesta

6

Creo que tiene que usar el método -lemento para archivar esto. No es bueno, pero es una solución.

Su tipo debe definir un método Add (clave de cadena, cadena de valor) que utiliza el contenedor de la unidad para inyectar los valores.

<method name="Add"> 
<param name="key" parameterType="string"> 
    <value value="localHost"/> 
</param> 
<param name="value" parameterType="string"> 
    <value value="127.0.0.1"/> 
</param> 
</method> 

Unidad definitivamente no es compatible con los diccionarios de configuración del contenedor. Veo Build Dictionaries using Unity container?

1

descubrí que la Unidad tiene errores al manipular los genéricos (http://unity.codeplex.com/Thread/View.aspx?ThreadId=30292), hay una solución bastante feo a esto:

public class MyDictionary : Dictionary<string,string>{ 

    public MyDictionary() { 

    } 
} 

ahora en el fichero de configuración:

 <typeAlias alias="string" type="System.String, mscorlib" />    
     <typeAlias alias="Dictionary" type="MyFakeNamespace.MyDictionary, MyFakeAppDll" /> 

...

y luego usando la sugerencia Jehof:

<type name="ConfigurationDictionary" type="Dictionary"> 
        <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement, Microsoft.Practices.Unity.Configuration"> 
         <method name="Add" key="0"> 
          <param name="key" parameterType="string"> 
           <value value="localHost"/> 
          </param> 
          <param name="value" parameterType="string"> 
           <value value="127.0.0.1"/> 
          </param> 
         </method> 
         <method name="Add" key="1"> 
          <param name="key" parameterType="string"> 
           <value value="contentHost"/> 
          </param> 
          <param name="value" parameterType="string"> 
           <value value="\\content"/> 
          </param> 
         </method> 
         <method name="Add" key="2"> 
          <param name="key" parameterType="string"> 
           <value value="virtualDir"/> 
          </param> 
          <param name="value" parameterType="string"> 
           <value value="/"/> 
          </param> 
         </method> 
        </typeConfig> 

       </type> 

El atributo clave en la etiqueta de método debe ser único para llamar al método Agregar varias veces.

Entonces, cuando se resuelva el fallo un pequeño cambio en los typeAlias ​​nos permiten poner el tipo correcto, pero creo que voy a dejar como lo es.