C# 团结:编一本字典
我正在将Castle/Monorails应用程序转换为Unity/Asp.NET MVC应用程序, 我一直在尝试转换此组件配置:C# 团结:编一本字典,c#,asp.net,unity-container,castle-monorail,C#,Asp.net,Unity Container,Castle Monorail,我正在将Castle/Monorails应用程序转换为Unity/Asp.NET MVC应用程序, 我一直在尝试转换此组件配置: <component id="ComponentBaseConfiguration" service="MyFakeNamespace.BOL.IConfiguration, MyFakeAppDll" type="MyFakeNamespace.BOL.ConfigurableConfiguration, MyFakeAppDll"> &
<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>
#{LocalHost}
#{ContentHost}
#{VirtualDir}
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>
127.0.0.1
\\内容
/
如何实现这样的目标?我认为必须使用method元素来归档。这不是一个好办法,而是一个变通办法 您的类型必须定义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绝对不支持容器配置的字典。请参见我发现Unity在处理泛型时存在缺陷 (), 有一个相当丑陋的解决方法:
public class MyDictionary : Dictionary<string,string>{
public MyDictionary() {
}
}
公共类MyDictionary:Dictionary{
公共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
然后,当缺陷得到解决时,typeAlias中的一点更改允许我们输入正确的类型,但我想我会按原样离开。我得到了类似的东西来工作。请看-这是我针对旧版本的解决方案-它需要对代码进行一些更改-当我有时间时,也许我会尝试将其适应新的统一版本,我必须使用不同的格式来工作: