Iniettare le impostazioni dell'app usando Windsor
-
05-07-2019 - |
Domanda
Come posso inserire il valore di una voce appSettings (da app.config o web.config) in un servizio usando il contenitore Windsor? Se volessi iniettare il valore di una proprietà Windsor in un servizio, farei una cosa del genere:
<properties>
<importantIntegerProperty>666</importantIntegerProperty>
</properties>
<component
id="myComponent"
service="MyApp.IService, MyApp"
type="MyApp.Service, MyApp"
>
<parameters>
<importantInteger>#{importantIntegerProperty}</importantInteger>
</parameters>
</component>
Tuttavia, ciò che mi piacerebbe davvero fare è prendere il valore rappresentato da # {importantIntegerProperty}
da una variabile delle impostazioni dell'app che potrebbe essere definita in questo modo:
<appSettings>
<add key="importantInteger" value="666"/>
</appSettings>
MODIFICA: per chiarire; Mi rendo conto che ciò non è nativamente possibile con Windsor e il David Hayden l'articolo a cui si riferisce sliderhouserules riguarda in realtà il suo contenitore IoC (di David Hayden), non Windsor.
Sicuramente non sono la prima persona ad avere questo problema, quindi quello che vorrei sapere è come gli altri hanno risolto questo problema?
Soluzione
Alla fine mi è venuta in mente una soluzione basata su suggerimenti da varie fonti sul web. Il risultato finale, tuttavia, ha comportato praticamente la copia integrale di tre classi da Windsor e la loro modifica solo un po '. Il risultato finale è su codeplex per il tuo divertimento.
http://windsorappcfgprops.codeplex.com/
Originariamente ho scritto questo codice un po 'di tempo fa, quindi è basato su Windsor 1.0.3 - sì, mi ci è voluto che tanto tempo per andare in giro a pubblicare il risultato!
Il codice ti consente di avere questo nel tuo app.config (o web.config, ovviamente):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="theAnswer" value="42"/>
</appSettings>
</configuration>
... e accedi ad esso dal tuo file di configurazione XML di Windsor in questo modo:
<?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>
C'è un esempio funzionante nella soluzione.
Altri suggerimenti
I ho scritto un post su un caso simile a un paio di mesi fa. Utilizza un SubDependencyResolver per iniettare i parametri appropriati. Nel tuo caso, puoi semplicemente modificare DynamicConfigurationSettings per ConfigurationManager.