2009-09-15 20 views
6

jestem konwersji aplikacji Zamek/kolejek w jedno/Asp.NET MVC jeden, Utknąłem w próby przekształcania tej konfiguracji komponent:Unity: Zbuduj słownika

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

wydaje się, że Unity obsługuje Array ale nie słownik, chciałbym zrobić coś takiego:

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

Jak mogę osiągnąć coś takiego?

+0

Mam coś takiego do pracy. zobacz - http://stackoverflow.com/questions/5597492/how-do-i-create-and-populate-a-dictionarystring-object-using-unitys-xml-confi/7901103#7901103 – ScArcher2

+0

Oto moje rozwiązanie dla starszych wersja - wymaga pewnych zmian w kodzie - kiedy będę miał czas, może spróbuję to zaadaptować do nowej wersji Unity http://unity.codeplex.com/discussions/230927/ – AdaskoTheBeAsT

Odpowiedz

6

Myślę, że musisz użyć metody - -element, aby to zarchiwizować. To nie jest miłe, ale obejście.

Twój typ musi definiować metodę Dodaj (klucz łańcucha, wartość ciągu), którego pojemnik jedności używa do wprowadzania wartości.

<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 zdecydowanie nie obsługuje słowników do konfiguracji kontenera. Zobacz Build Dictionaries using Unity container?

1

odkryłem, że Unity ma błędy podczas przeładunku Generics (http://unity.codeplex.com/Thread/View.aspx?ThreadId=30292) jest dość brzydki obejście tego:

public class MyDictionary : Dictionary<string,string>{ 

    public MyDictionary() { 

    } 
} 

teraz w pliku konfiguracyjnym:

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

...

a następnie za pomocą sugestii 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> 

Kluczowy atrybut w tagu metody musi być unikalny, aby wywołać metodę Dodaj wiele razy.

Następnie, gdy błąd zostanie rozwiązany, niewielka zmiana w typieAlias ​​pozwala nam ustawić odpowiedni typ, ale myślę, że opuści się, jak to jest.