2011-01-04 2 views
3

Я не могу узнать, как использовать элемент, определенный в словаре (xml spring config) в другом месте весеннего файла xml. Я пробовал что-то подобное, но у меня когда-либо возникала ошибка при инициализации «obj1».Spring.Net ref to Dictionary item

<object name="Paths" id="Paths" type="System.Collections.Generic.Dictionary&lt;string,string&gt;"> 
    <constructor-arg> 
     <dictionary key-type="string" value-type="string"> 
     <entry key="cfgFile"> 
      <value>config.txt</value> 
     </entry> 
     </dictionary> 
    </constructor-arg> 
    </object> 
    <object name="obj1" type="MyTestClass" depends-on="Paths"> 
    <property name="cfg" expression="${Paths['cfgFile']}"/> 
    </object> 

Спасибо за вашу помощь ...

+0

Не могли бы вы сообщить подробности о своем сообщении об ошибке? – Marijn

ответ

2

Мой первоначальный ответ был принят, но теперь я считаю, что лучшим ответом будет:

Ваше выражение не является правильным, оно должно быть:

<object name="obj1" type="MyTestClass" depends-on="Paths"> 
    <property name="cfg" expression="@(Paths)['cfgFile']"/> 
</object> 

Вы можете использовать @(object-id-here)expression syntax to retrieve an object from the Spring context using an expression.

Edit - ниже ответ, который был принят

Я могу себе представить, что вы хотели бы такой конфигурации должны быть доступны в вашем app.config. Если это так, вы можете использовать PropertyPlaceholderConfigurer; см. пример в section 5.9.2.1.

В вашем случае, это будет выглядеть примерно так:

<!-- app.config --> 
<configuration> 

    <configSections> 
    <sectionGroup name="spring"> 
     <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/> 
    </sectionGroup> 
    <section name="PathConfiguration" type="System.Configuration.NameValueSectionHandler"/> 
    </configSections> 

    <PathConfiguration> 
    <add key="cfgFile" value="config.txt"/> 
    <add key="otherCfgFile" value="otherconfig.txt"/> 
    </PathConfiguration> 

    <spring> 
    <context> 
     <resource uri="mycongfig.xml"/> 
    </context> 
    </spring> 

</configuration> 

И ваш myconfig.xml содержит:

<!-- ... --> 
<object name="obj1" type="MyTestClass"> 
    <property name="cfg" value="${cfgFile}"/> 
</object> 

<object name="appConfigPropertyHolder" 
     type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core"> 

    <property name="configSections">   
     <value>PathConfiguration</value>        
    </property>    

</object> 
<!-- ... --> 

Обратите внимание, что вместо app.config, вы можете использовать любой другой IResource.

Альтернативным решением является определение cfgFile как объект в вашей конфигурации, а затем в своем словаре ссылкой этот объект с помощью value-ref (см пружинные DOCS 5.3.2.4 о том, как это сделать). Но это (возможно) не то, что вы ищете, так как вы вводите примитивные значения (так что это не стоит усилий для создания явного ConfigurationObject).

+0

Это то, что я искал, оба подхода ценны для моих целей. –

+0

Спасибо, Мэрийн. –