Pregunta

¿Cómo puedo inyectar el valor de una entrada appSettings (desde app.config o web.config) en un servicio utilizando el contenedor de Windsor? Si quisiera inyectar el valor de una propiedad de Windsor en un servicio, haría algo como esto:

<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} de una variable de configuración de la aplicación que podría definirse así:

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

EDITAR: para aclarar; Me doy cuenta de que esto no es posible de forma nativa con Windsor y el David Hayden el artículo al que se refiere sliderhouserules es en realidad sobre su propio contenedor IoC (de David Hayden), no 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?

¿Fue útil?

Solución

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

http://windsorappcfgprops.codeplex.com/

Originalmente escribí este código hace bastante tiempo, así que está basado en Windsor 1.0.3. Sí, me tomó ese tiempo para publicar el resultado.

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

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

... y acceda a él desde su archivo de configuración XML de Windsor como este:

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

Otros consejos

I escribí una publicación sobre un caso similar a Hace un par de meses. Utiliza un SubDependencyResolver para inyectar los parámetros apropiados. En su caso, solo puede cambiar DynamicConfigurationSettings para ConfigurationManager.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top