Frage

Ich konvertiere eine Anwendung von Burg/Monorails in eine Einheit/ASP.NET MVC.

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

Scheint, dass die Einheit Array unterstützt, aber kein Wörterbuch, würde ich so etwas tun:

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

Wie kann ich so etwas erreichen?

War es hilfreich?

Lösung

Ich denke, du musst das benutzen Methode-Element, um dies zu archivieren. Es ist nicht schön, aber eine Problemumgehung.

Ihr Typ muss eine Methode Add (String -Schlüssel, Stringwert) definieren, mit der der Unity Container die Werte injiziert.

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

Unity unterstützt definitiv keine Wörterbücher für die Containerkonfiguration. Sehen Wörterbücher mit Unity Container bauen?

Andere Tipps

Ich entdeckte, dass Unity beim Umgang mit Generika Fehler hat (http://unity.codeplex.com/thread/view.aspx?threadid=30292) Es gibt eine ziemlich hässliche Problemumgehung:

public class MyDictionary : Dictionary<string,string>{

    public MyDictionary() { 

    }
}

Jetzt in der Konfigurationsdatei:

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

...

und dann den Jehof -Vorschlag verwenden:

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

Das Schlüsselattribut im Methode -Tag muss eindeutig sein, um die Methode mehrmals hinzuzufügen.

Wenn der Fehler dann eine kleine Veränderung in den Typen gelöst wird, erlauben wir den richtigen Typ, aber ich denke, ich werde wie es ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top