2009-09-15 55 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允许我们把正确的类型的一点点改变,但我想我会离开它。