2009-09-15 6 views
6

Я преобразование приложения Замок/монорельсами в Unity/Asp.NET MVC один, я застрял в попытке преобразования этой конфигурации компонента:Unity: Создайте словарь

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

кажется, что Unity поддерживает массив, но не словарь, я хотел бы сделать что-то вроде этого:

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

Как я могу добиться чего-то вроде этого?

+0

У меня есть что-то подобное, чтобы работать. см. http://stackoverflow.com/questions/5597492/how-do-i-create-and-populate-a-dictionarystring-object-using-unitys-xml-confi/7901103#7901103 – ScArcher2

+0

Вот мое решение для более старых версия - это требует некоторых изменений в коде - когда у меня будет время, возможно, я попытаюсь адаптировать это к новой версии Unity http://unity.codeplex.com/discussions/230927/ – AdaskoTheBeAsT

ответ

6

Я думаю, вы должны использовать метод -элемент, чтобы его архивировать. Это не приятно, но обходной путь.

Ваш тип должен определять метод Add (строковый ключ, строковое значение), который контейнер объединения использует для ввода значений.

<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 определенно не поддерживает словари для конфигурации контейнера. См Build Dictionaries using Unity container?

1

Я обнаружил, что Unity есть ошибки при работе с Generics (http://unity.codeplex.com/Thread/View.aspx?ThreadId=30292), есть довольно уродливые обходной путь к этому:

public class MyDictionary : Dictionary<string,string>{ 

    public MyDictionary() { 

    } 
} 

сейчас в конфигурационном файле:

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

...

, а затем с использованием предложения 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> 

ключевой атрибут тега метода должен быть уникальным, чтобы вызвать метод Добавить несколько раз.

Тогда, когда ошибка будет решена, небольшое изменение типаAlias ​​позволит нам установить правильный тип, но я думаю, что я уйду, как есть.

 Смежные вопросы

  • Нет связанных вопросов^_^