0

我在控制台应用程序中使用 C# 和 Spring Net 1.3.2。

我得到:一个 app.cfg 一个 spring-context.xml 一个 environnement.xml 文件,其中包含根据应用程序运行的位置的特定变量值:一个用于生产的文件夹,一个用于 qa,一个用于测试。

我想要实现的目标:在我的 shell(windows)中,在使用 foo.bat 启动应用程序之前,我会:set environment="qa"

当 Spring 加载上下文时,它会选择环境变量(比如 qa)中包含的值,并加载正确的文件:从而替换:configuration/{environment}/vars.xml

通过配置/qa/vars.xml。

在我的 spring-context.xml 文件中,我得到了这样的对象: value = ${connectionString.DB1}" 在每个 vars.xml 文件中定义了值(请记住,一个用于 prod,一个用于 qa ...) .

目前,我无法替换 ${environment} 变量。所以我通过使用 System.Environment.GetEnvironmentVariable("environnement"); 获取 ${environment} 的值以编程方式完成了它。并使用 Path.Combine,自己加载两个上下文:

reader.LoadObjectDefinitions(envPath); reader.LoadObjectDefinitions("configuration/common/springContext.xml");

但是:我想通过配置来实现。我一直在玩(没有运气):

    <object type="Spring.Objects.Factory.Config.VariablePlaceholderConfigurer, Spring.Core">
      <property name="VariableSources">
        <list>
          <object type="Spring.Objects.Factory.Config.EnvironmentVariableSource, Spring.Core"/>
        </list>
      </property>
    </object>


   <object name="appConfigPropertyHolder"
            type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
       <property name="EnvironmentVariableMode" value="Override"/>
    </object>

有任何想法吗 ?

4

1 回答 1

1

好的,经过大量研究,它有效!

<object type="Spring.Objects.Factory.Config.VariablePlaceholderConfigurer, Spring.Core">
      <property name="VariableSources">
        <list>
          <object type="Spring.Objects.Factory.Config.EnvironmentVariableSource, Spring.Core"/>      
          <object type="Spring.Objects.Factory.Config.PropertyFileVariableSource, Spring.Core">
            <property name="Location" value="${root.config}/envars.properties" />
            <property name="IgnoreMissingResources" value="false"/>
          </object>
        </list>
      </property>
    </object>

属性文件的路径取决于环境变量。变量被从属性文件中获得的值替换。

我部署了一个包含 4 个环境属性文件的包 + 文件夹,并相应地设置了我的 env var。无需弄乱 app.config 或多个 Spring 配置文件。

于 2013-06-06T15:47:12.687 回答