2008-10-15 8 views
5

Tengo muchas configuraciones castle xml donde las propiedades como connectionstring también se mantienen en las secciones de configuración de .Net.Cómo leer/resolver propiedades desde la configuración de Castle Windsor

Me gustaría poder leer las propiedades utilizando el contenedor pero no veo un mecanismo para hacerlo.

es decir

<castle> 
    <configuration> 
    <properties> 
     <connectionString>Data Source=MyServer;Initial Catalog=YadaYada;User  ID=me;Password=IAmGod</connectionString> 
    </properties> 
    <components> 

...

Obviamente las propiedades están ahí, ya que hay dependencias de componentes en ellos. Puedo resolver los componentes pero no las propiedades.

Claro que podría actualizar un componente solo para leer el castillo de la propiedad que se lo inyectó, o podría envolver todas las propiedades en un componente especializado simplemente para mantener los pares nombre/valor. Pero hubiera pensado que habría una notación simple container.resolve ("property.connectionstring").

* Editar No muy bien con el descuento, antes se suponía que era una sección xml.

+0

posible duplicado de [Inyectar configuración de la aplicación usando Windsor] (http://stackoverflow.com/questions/244935/inject-app-settings-using-windsor) –

Respuesta

1

¿No estás pensando en esto al revés?

Seguramente el objeto que utiliza la cadena de conexión debe tener una propiedad ConnectionString en el constructor y la dependencia empujado allí con algo en la sección de componentes de configuración como:

<component type="SessionManager"> 
    <parameters> 
    <connectionString>#{connectionString}</connectionString> 
    </parameters> 
</component> 

De esta manera la cadena de conexión se se pasará automáticamente y su componente no necesitará saber nada sobre el contenedor: ¡desacoplado y cohesivo!

+1

No. Mis componentes utilizan la dependencia tal como lo ha publicado . Pero quiero acceder directamente a las propiedades definidas en el archivo de configuración en el código, tal como lo haría con My.Setting.ConnectionString yada yada si usaba el estilo de configuración de vanilla .NET –

2

Puede hacer esto de diferentes maneras: para una solución fuertemente tipada, el enfoque más obvio sería implementar una clase de configuración personalizada, luego conecte las propiedades de la clase con las propiedades en la configuración de windsor (propiedades de solo lectura) con un montón de argumentos de constructor probablemente sea mejor, así que otros desarrolladores no creen que puedan actualizarlos) - hay un poco de trabajo en mantener los dos sincronizados como usted señaló. Tal vez escriba una pequeña herramienta para analizar los archivos de configuración para generar la definición de configuración/clase de windsor para este componente, por lo que no necesita mantenerla.

Otra alternativa sería tomar el intérprete de configuración existente y exponer las propiedades que se recopilan durante el análisis de la configuración; habría un poco de trabajo (pero no demasiado) para conseguir esto ... Creo que podrías hacer esto por:

  • Creación de una IXmlProcessorEngine decorador de implementar que captura las llamadas a AddProperty (elemento XmlElement) y almacena los elementos en su propio diccionario privado.
  • Reemplace XmlProcessor con su propia implementación (es decir, copie el código fuente de la clase, luego modifique el constructor para envolver al decorador en la instancia DefaultXmlProcessorEngine que está haciendo el trabajo real, de modo que se graben las diversas llamadas de propiedad adicional) .
  • Herede de XmlInterpreter y anule el método ProcessResource para que llame a su reemplazo de XmlProcessor.
  • Decida cómo quiere llegar a las propiedades que almacena su decorador, quizás esté configurado con un diccionario que se transfiere a través del constructor de XmlInterpreter y XmlProcessor, a su vez.

Desafortunadamente yo sepa esas propiedades no se transmiten a la tienda de configuración, ya que sólo son utilizados durante la etapa de interpretación - además de que no creen que los convertidores de tipos se invocan en esta etapa del análisis, por lo los valores serán cadenas, pero al menos las sentencias de condición if/else etc. serán evaluadas correctamente, así como también incluidas.

+0

Implementé esta sugerencia (más o menos). Se siente como un truco realmente desagradable, pero funciona. Aclamaciones. –

Cuestiones relacionadas