【问题标题】:Unity: Build up a dictionaryUnity:建立字典
【发布时间】:2009-09-15 13:08:10
【问题描述】:

我正在将 Castle/Monorails 应用程序转换为 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支持Array但不支持Dictionary,我想做这样的事情:

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

我怎样才能实现这样的目标?

【问题讨论】:

标签: c# asp.net unity-container castle-monorail


【解决方案1】:

我认为你必须使用 method-元素来归档它。这不是很好,而是一种解决方法。

你的类型必须定义一个方法 Add(string key, string value) 统一容器用来注入值。

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

【讨论】:

  • 我必须使用不同的格式才能工作:
    &lt;method name="Add"&gt; &lt;param name="key" value="tstKey"/&gt; &lt;param name="value" value="tstValue"/&gt; &lt;/method&gt;
【解决方案2】:

我发现 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" />

...

然后使用 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>

方法标签中的key属性需要唯一才能多次调用方法添加。

然后,当 bug 解决时,在 typeAlias 中稍作更改允许我们放置正确的类型,但我想我会保持原样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多