model view controller - AutoFac y Log4Net: registro y uso
model-view-controller (1)
El módulo log4net es como cualquier otro módulo Autofac ; lo registra (como se muestra) en el ContainerBuilder
junto con todos sus otros registros.
// EITHER
builder.RegisterModule<LoggingModule>();
// OR
builder.RegisterModule(new LoggingModule());
La documentación en la página del módulo log4net explica cómo se puede usar para inyectar parámetros ILog
en constructores o propiedades en sus objetos.
Entonces, al igual que cualquier otra clase estructurada de IoC, para consumirla, agregaría un constructor o propiedad para permitir que se inyecte.
public class SomeClassThatNeedsLogging
{
private ILog _logger;
public SomeClassThatNeedsLogging(ILog logger)
{
this._logger = logger;
}
}
Y, de nuevo, puede usar la inyección de constructor o propiedad.
public class SomeClassThatNeedsLogging
{
public ILog Logger { get; set; }
}
Cuando resuelve su consumidor registrado, Autofac realiza el cableado.
var someClass = container.Resolve<SomeClassThatNeedsLogging>();
// someClass will have the ILog value populated.
Para los controladores, ya está registrando aquellos con Autofac, por lo que todo lo que necesita hacer es agregar el parámetro de constructor o la propiedad de escritura pública. La integración de MVC hace toda la resolución, por lo que no hay nada manual que hacer, ninguna llamada de Resolve
ni nada.
Si aún no está claro, recomiendo pasar un tiempo con la guía de inicio rápido Autofac y sumergirse en el resto de la documentación .
Me han instruido sobre el uso de AutoFac (en lugar de Castle Windsor) junto a log4net y estoy perdido en cómo usar correctamente estas tecnologías juntas.
Usando el ejemplo en el sitio web de autofac tengo el siguiente LoggerModule
public class LoggingModule : Module
{
private static void InjectLoggerProperties(object instance)
{
var instanceType = instance.GetType();
// Get all the injectable properties to set.
// If you wanted to ensure the properties were only UNSET properties,
// here''s where you''d do it.
var properties = instanceType
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.PropertyType == typeof(ILog) && p.CanWrite && p.GetIndexParameters().Length == 0);
// Set the properties located.
foreach (var propToSet in properties)
{
propToSet.SetValue(instance, LogManager.GetLogger(instanceType), null);
}
}
private static void OnComponentPreparing(object sender, PreparingEventArgs e)
{
var t = e.Component.Activator.LimitType;
e.Parameters = e.Parameters.Union(
new[]
{
new ResolvedParameter((p, i) => p.ParameterType == typeof(ILog),
(p, i) => LogManager.GetLogger(t))
});
}
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
{
// Handle constructor parameters.
registration.Preparing += OnComponentPreparing;
// Handle properties.
registration.Activated += (sender, e) => InjectLoggerProperties(e.Instance);
}
}
Y el siguiente código que lo registra
builder.RegisterModule(new LoggingModule());
¿Es este el método correcto para integrarlo?
¿Y cómo lo uso en, digamos, un controlador MVC?