代码之家  ›  专栏  ›  技术社区  ›  kentaromiura

统一:编字典

  •  6
  • kentaromiura  · 技术社区  · 15 年前

    我正在将Castle/Monorals应用程序转换为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支持数组,但不支持字典,我想这样做:

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

    我怎样才能做到这一点?

    2 回复  |  直到 9 年前
        1
  •  6
  •   Jehof    15 年前

    我想你必须使用 方法 -用于存档此的元素。这不是很好,而是一个变通办法。

    类型必须定义Unity容器用于注入值的方法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?

        2
  •  1
  •   kentaromiura    15 年前

    我发现Unity在处理泛型时有缺陷 ( 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" />
    

    然后用热河的建议:

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

    然后,当这个bug得到解决时,typealias中的一点变化允许我们放置正确的类型,但我想我还是会离开。