Spring.Net ссылка на словарь - PullRequest
3 голосов
/ 04 января 2011

Я не могу выяснить, как использовать элемент, определенный в словаре (xml spring config), в другом месте в весеннем xml-файле.Я пытался что-то вроде этого, но я всегда получаю сообщение об ошибке в init "obj1".

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

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

1 Ответ

2 голосов
/ 04 января 2011

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

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

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

Вы можете использовать синтаксис выражения @(object-id-here) для извлечения объекта из контекста Spring, используя выражение .

Редактировать - ниже приведен ответ, который был принят

Я могу представить, что вы хотели бы, чтобы такая конфигурация была доступна в вашем app.config. Если это так, вы можете использовать PropertyPlaceholderConfigurer; см. пример в раздел 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 (см. Документацию по Spring 5.3.2.4 , как это сделать) , Но это (вероятно) не то, что вы ищете, поскольку вы вводите примитивные значения (поэтому не стоит усилий по созданию явного ConfigurationObject).

...