13

如何使用 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>

编辑:澄清;我意识到这在 Windsor 中是不可能的,sliderhouserules所指的David Hayden 文章实际上是关于他自己的(David Hayden 的)IoC 容器,而不是 Windsor。

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

4

2 回答 2

6

我最终根据网络上各种来源的提示提出了一个解决方案。最终结果虽然涉及从温莎逐字复制三个类并稍微修改它们。最终结果在 codeplex 上供您欣赏。

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>

解决方案中有一个工作示例。

于 2010-04-17T17:15:23.840 回答
2

几个月前,我写了一篇关于类似案例的帖子。它使用 SubDependencyResolver 注入适当的参数。在您的情况下,您只需更改 ConfigurationManager 的 DynamicConfigurationSettings。

于 2008-11-12T13:05:51.057 回答