使用Windsor注入应用程序设置

时间:2008-10-28 21:28:49

标签: castle-windsor appsettings

如何使用Windsor容器将appSettings条目的值(从app.config或web.config)注入服务?如果我想将一个Windsor属性的值注入服务中,我会做这样的事情:

<properties>
    <importantIntegerProperty>666</importantIntegerProperty>
</properties>
<component
    id="myComponent"
    service="MyApp.IService, MyApp"
    type="MyApp.Service, MyApp"
    >
    <parameters>
        <importantInteger>#{importantIntegerProperty}</importantInteger>
    </parameters>
</component>

但是,我真正想要做的是从应用程序设置变量中获取#{importantIntegerProperty}表示的值,该变量可能是这样定义的:

<appSettings>
    <add key="importantInteger" value="666"/>
</appSettings>

编辑:澄清;我意识到温莎并不是本身可能的,David Hayden article所指的sliderhouserules实际上是关于他自己的(David Hayden的)IoC容器,而不是温莎。

我肯定不是第一个遇到这个问题的人所以我想知道的是其他人如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

我最终根据网络上各种来源的提示想出了一个解决方案。最终结果虽然涉及从Windsor逐字复制三个类并稍微修改它们。最终的结果是编码复合,让您享受。

http://windsorappcfgprops.codeplex.com/

我最初在很久以前编写了这段代码,所以它基于Windsor 1.0.3 - 是的,我花了 很长时间来发布结果!

代码允许您在app.config(或web.config,显然)中使用此代码:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="theAnswer" value="42"/>
  </appSettings>
</configuration>

...并从您的Windsor XML配置文件中访问它,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<castle>
  <components>
    <component
      id="answerProvider"
      service="Acme.IAnswerProvider, Acme"
      type="Acme.AnswerProvider, Acme"
      >
      <parameters>
        <theAnswer>#{AppSetting.theAnswer}</theAnswer>
      </parameters>
    </component>
  </components>
</castle>

解决方案中有一个有效的例子。

答案 1 :(得分:2)

wrote a post关于几个月前的类似案例。它使用SubDependencyResolver注入适当的参数。在您的情况下,您只需更改ConfigurationManager的DynamicConfigurationSettings。