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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top