2008-10-28 6 views
12

¿Cómo puedo inyectar el valor de una entrada de AppSettings (desde app.config o web.config) en un servicio usando el contenedor Windsor? Si quería inyectar el valor de una propiedad de Windsor en un servicio, me gustaría hacer algo como esto:Inyectar la configuración de la aplicación usando Windsor

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

Sin embargo, lo que realmente me gustaría hacer es tomar el valor representado por #{importantIntegerProperty} desde una configuración de aplicaciones variable que podría definirse así:

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

EDIT: Para aclarar; Me doy cuenta de que esto no es posible de forma nativa con Windsor y el David Hayden article que se refiere a sliderhouserules en realidad se trata de su propio contenedor IoC (David Hayden), no de Windsor.

Seguramente no soy la primera persona en tener este problema, entonces ¿qué me gustaría saber es cómo otras personas han resuelto este problema?

Respuesta

5

Se me ocurrió una solución para esto eventualmente basada en sugerencias de varias fuentes en la web. El resultado final, sin embargo, implicó copiar literalmente tres clases de Windsor y modificarlas solo un poco. El resultado final está en codeplex para su disfrute.

http://windsorappcfgprops.codeplex.com/

originalmente escribió este código hace bastante tiempo por lo que se basa en Windsor 1.0.3 - Sí, me tomó que tiempo para moverse a publicar el resultado!

El código le permite tener esto en su app.config (o web.config, obviamente):

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

... y acceder a ella desde su archivo de configuración XML Windsor así:

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

Hay un ejemplo de trabajo en la solución.

+5

Hay otro enfoque basado en el componente DictionaryAdapter, que se proporciona OOTB en Windsor 2.5 o posterior http://codebetter.com/blogs/benhall/archive/2010/07/22/improving-testability-with-the-castle-dictionary- adapter.aspx –

+0

Gracias por el enlace, Krzysztof. Yo prefiero ese enfoque también. –

2

I wrote a post sobre un caso similar hace un par de meses. Utiliza un SubDependencyResolver para inyectar los parámetros apropiados. En su caso, puede simplemente cambiar DynamicConfigurationSettings para ConfigurationManager.

+0

Agradable. Gracias, Mausch. Ese es el puntero en la dirección correcta que estaba buscando. –

Cuestiones relacionadas