Unity:辞書を作成する
-
07-07-2019 - |
質問
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は辞書をサポートしていて配列はサポートしていないようです。次のようなことをしたいと思います:
<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>
このようなことを実現するにはどうすればよいですか
解決
これをアーカイブするには、 method 要素を使用する必要があると思います。それは良いことではありませんが、回避策です。
タイプは、Unityコンテナが値の注入に使用するメソッド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は間違いなく、コンテナ設定用の辞書をサポートしていません。 Unityコンテナを使用して辞書を構築しますか
を参照してください。他のヒント
Genericsの処理時に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>
メソッドAddを複数回呼び出すには、メソッドタグのキー属性が一意である必要があります。
その後、バグが解決されると、typeAliasの少しの変更により正しいタイプを入力できますが、そのままにしておきます。
所属していません StackOverflow