Domanda

Sto convertendo un'applicazione Castle / Monorails in un'applicazione Unity / Asp.NET MVC, Sono bloccato nel tentativo di convertire questa configurazione del componente:

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

sembra che Unity supporti l'array ma non il dizionario, vorrei fare qualcosa del genere:

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

Come posso ottenere qualcosa del genere?

È stato utile?

Soluzione

Penso che devi usare il metodo -elemento per archiviare questo. Non è carino ma una soluzione alternativa.

Il tuo tipo deve definire un metodo Add (chiave stringa, valore stringa) che il contenitore di unità utilizza per iniettare i valori.

<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 sicuramente non supporta i dizionari per la configurazione del contenitore. Vedi Crea dizionari usando il contenitore Unity?

Altri suggerimenti

Ho scoperto che Unity ha dei bug durante la gestione di Generics ( http://unity.codeplex.com/Thread/View.aspx?ThreadId = 30292 ), c'è una soluzione piuttosto brutta a questo:

public class MyDictionary : Dictionary<string,string>{

    public MyDictionary() { 

    }
}

ora nel file di configurazione:

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

...

e quindi utilizzando il suggerimento 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'attributo chiave nel tag del metodo deve essere univoco per poter chiamare il metodo Aggiungi più volte.

Quindi, quando il bug verrà risolto, un piccolo cambiamento nel tipoAlias ??ci permetterà di mettere il tipo giusto, ma penso che lascerò così com'è.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top