2009-09-15 82 views
6

我轉換城堡/單軌應用爲Unity/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> 

似乎團結支持數組,但沒有解釋,我願做這樣的事情:

<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 2011-10-26 18:52:10

+0

這是我的解決方案版本 - 它需要對代碼進行一些更改 - 當我有時間時,也許我會嘗試將它適應Unity的新版本http://unity.codeplex.com/discussions/230927/ – AdaskoTheBeAsT 2016-05-31 13:11:19

回答

6

我認爲你必須使用方法 -element來存檔這個。這不是很好,而是一種解決方法。

您的類型必須定義一個方法添加(字符串鍵,字符串值)統一容器用於注入值。

<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

我發現團結具有處理泛型 (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> 

方法標記中的關鍵屬性需要唯一,才能調用方法Add多次。

然後,當錯誤將被解決的類型Alias允許我們把正確的類型的一點點改變,但我想我會離開它。