c# .net logging inversion-of-control castle-windsor

c# - Dónde y cómo Castle Windsor establece la instalación de tala



.net logging (3)

El registrador se configura mediante el recurso de registro, que está en la sección <facilities> de la configuración. Por ejemplo, para usar log4net tu aplicación o web.config se vería así:

<?xml version="1.0"?> <configuration> <configSections> <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/> </configSections> <Configuration> <castle> <facilities> <facility id="loggingfacility" type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" loggingApi="log4net" configFile="logging.config" /> </facilities> </castle> </configuration>

Soy bastante nuevo en Castle Windsor y estoy investigando las entradas y salidas de las instalaciones de tala. Parece bastante impresionante, pero lo único que no puedo resolver es dónde Windsor establece la propiedad Logger en mis clases. Como en el siguiente código, se configurará Logger en nullLogger si la clase aún no se ha configurado, pero cuando Resolve finaliza, se ejecuta la propiedad Logger.

private ILogger logger; public ILogger Logger { get { if (logger == null) logger = NullLogger.Instance; return logger; } set { logger = value; } }

Entonces, lo que me pregunto es cómo y dónde windsor establece mi propiedad Logger.

Saludos Anthony


También puede configurar esto programáticamente cuando inicialice windsor (por ejemplo, desde su global.asax.cs):

container.AddFacility("logging", new LoggingFacility(LoggerImplementation.Log4net));

Por supuesto, puede elegir cualquiera de las implementaciones del registrador.

Esto se conectará cada vez que Windsor crea una instancia de cualquier clase esperando un registrador. No pondría esto en el constructor, ya que es una preocupación transversal, es mejor hacer lo que sugirió en mi opinión. Puedes simplificarlo un poco:

private ILogger logger = NullLogger.Instance; public ILogger Logger { get { return logger; } set { logger = value; } }


Como tiene una propiedad pública con un Setter, cada vez que resuelva su objeto desde Windsor, también intentará establecer cualquier propiedad pública con los valores apropiados del contenedor (en su caso, un ILogger que su instalación poblará en Windsor).

Es decir, si resuelve la Clase desde Windsor, esto se establecerá. Pero no si haces una nueva Clase ().

Eso es al menos cómo lo entiendo.

El otro enfoque es usar constructores, lo que significa que si tienes un constructor llamado

public Class (Logger ILogger) se instanciará con ILogger como parámetro.

Ejemplo:

var yourClassObject = Kernel.Resolve<IClass>();

Si no tiene una especificación de interfaz (y está registrada como tal), tendrá que registrar su componente como tipo concreto si desea resolverlo utilizando ese tipo de concreto (y no por interfaz).