Inject Configurações de aplicativo usando Windsor
-
05-07-2019 - |
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?
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.