Spring.Net引用字典项

时间:2011-01-04 08:05:55

标签: c# dictionary spring.net

我无法找到如何在spring xml文件中的其他位置使用字典(xml spring config)中定义的项目。我尝试过类似的东西,但是我在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 个答案:

答案 0 :(得分: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

编辑 - 以下是接受的答案

我可以想象您希望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引用此对象(有关如何执行此操作,请参阅spring docs 5.3.2.4) 。但是这(可能)并不是你想要的,因为你注入了原始值(因此创建一个明确的ConfigurationObject并不值得。)