Question

Je suis en train de convertir une application Castle / Monorails en une application Unity / Asp.NET MVC, Je suis coincé pour essayer de convertir cette configuration de composant:

<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>

semble que Unity supporte Array mais pas Dictionary, je voudrais faire quelque chose comme ceci:

<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>

Comment puis-je obtenir quelque chose comme ça?

Était-ce utile?

La solution

Je pense que vous devez utiliser la méthode -element pour archiver cela. Ce n'est pas bien mais une solution de contournement.

Votre type doit définir une méthode Add (clé de chaîne, valeur de chaîne) que le conteneur d'unité utilise pour injecter les valeurs.

<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>

Certainement, Unity ne prend pas en charge les dictionnaires pour la configuration des conteneurs. Voir Créer des dictionnaires à l'aide du conteneur Unity?

Autres conseils

J'ai découvert qu'Unity avait des bugs lors de la gestion des génériques. ( http://unity.codeplex.com/Thread/View.aspx?ThreadId = 30292 ), Il existe une solution de contournement assez moche à ceci:

public class MyDictionary : Dictionary<string,string>{

    public MyDictionary() { 

    }
}

maintenant dans le fichier de configuration:

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

...

puis en utilisant la suggestion de 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>

l'attribut key dans la balise method doit être unique pour appeler la méthode Add multiple times.

Ensuite, lorsque le bogue sera résolu, un petit changement dans le typeAlias ??nous permettra de mettre le bon type, mais je pense que je partirai tel quel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top