Pergunta

Como posso injetar o valor de uma entrada appSettings (de app.config ou web.config) em um serviço usando o recipiente de Windsor? Se eu quisesse injetar o valor de uma propriedade Windsor em um serviço, eu faria algo assim:

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

No entanto, o que eu realmente gostaria de fazer é tomar o valor representado por #{importantIntegerProperty} da variável um aplicativo configurações que podem ser definidas como este:

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

EDIT: Para esclarecer; Sei que isso não é nativamente possível com Windsor ea David Hayden artigo que sliderhouserules se refere é realmente sobre o seu próprio recipiente (de David Hayden) IoC, não Windsor.

Eu não sou certamente a primeira pessoa a ter esse problema para que eu gostaria de saber é como ter outras pessoas resolveram esse problema?

Foi útil?

Solução

Eu vim com uma solução para isso, eventualmente, com base em sugestões de várias fontes na web. O resultado final, porém envolveu praticamente copiando três classes de Windsor verbatim e modificá-los um pouco. O resultado final é para cima no CodePlex para sua diversão.

http://windsorappcfgprops.codeplex.com/

Eu originalmente escreveu este código algum tempo atrás, então ele é baseado em Windsor 1.0.3 - sim, ele me levou que tempo para dar a volta a publicar o resultado

O código permite que você tenha isso em seu app.config (ou web.config, obviamente):

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

... e acessá-lo a partir de seu arquivo de configuração XML Windsor assim:

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

Há um exemplo de trabalho na solução.

Outras dicas

escreveu um post sobre um caso semelhante a par de meses atrás. Ele usa um SubDependencyResolver para injetar os parâmetros apropriados. No seu caso, você pode simplesmente mudar DynamicConfigurationSettings para ConfigurationManager.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top