[英]autofac wiring Type to my logger
我有一个记录器,如下所示:
public class Logger : ILogger
{
private ILogger _logger;
public Logger(Type type)
{
_logger = LogManager.CreateLogger(type);
}
.... removed
我正在尝试构建一个日志模块:
public class LogModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
const string propertyNameKey = "Autofac.AutowiringPropertyInjector.InstanceType";
builder.RegisterType<Logger>().As<ILogger>();
base.Load(builder);
}
}
我必须找到类型并将其注入Logger
,类似这个问题的问题,但是那个问题是属性注入,我需要ctor注入。
如何获取上下文日志,即每种类型的日志?
您可以使用注册对象的Preparing
。 此代码取自autofac页面 。
public class LoggingModule : Autofac.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)
{
e.Parameters = e.Parameters.Union(
new[]
{
new ResolvedParameter(
(p, i) => p.ParameterType == typeof(ILog),
(p, i) => LogManager.GetLogger(p.Member.DeclaringType)
),
});
}
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
{
// Handle constructor parameters.
registration.Preparing += OnComponentPreparing;
// Handle properties.
registration.Activated += (sender, e) => InjectLoggerProperties(e.Instance);
}
}
这段代码:
private static void OnComponentPreparing(object sender, PreparingEventArgs e)
{
e.Parameters = e.Parameters.Union(
new[]
{
new ResolvedParameter(
(p, i) => p.ParameterType == typeof(ILog),
(p, i) => LogManager.GetLogger(p.Member.DeclaringType)
),
});
}
将新的记录器(使用类名)注入CTOR。
class ClassA
{
...
ClassA(ILog logger) => this.logger = logger; // logger was created by Autofac via LogManager.GetLogger("ClassA")
}
希望这就是您要寻找的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.