我正在更新一个使用 AutoFac 的遗留项目,并且我想将 NLog 与 Simple Logging Facade (SLF) 结合使用
我过去曾在 Ninject 中使用过它,它的设置非常简单,我只需要执行以下操作:
kernel.Bind<ILogger>().ToMethod(x => LoggerFactory.GetLogger(x.Request.Target.Member.ReflectedType));
输出将类似于:
NLogNinjectSlf.Services.MyService2013-12-30 15:21:10.5782 从注入的记录器调试日志
小菜一碟
但现在我必须使用 AutoFac 并且我不知道如何获取目标类型需要记录器
例如,如果我有以下接口/类:
public interface IMyService
{
void DoSomething();
}
public class MyService : IMyService
{
private readonly ILogger _logger;
public MyService(ILogger logger)
{
_logger = logger;
}
public void DoSomething()
{
_logger.Debug("Log from injected Logger");
}
}
我希望能够获得以下类型MyService
类将其用作我的记录器的名称
在 AutoFac 中,这是我迄今为止尝试过的:
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<MyService>().As<IMyService>();
containerBuilder.Register(x =>
{
// TODO: Get the correct type
return LoggerFactory.GetLogger(x.GetType());
}).As<ILogger>();
顺便说一句:我在 SLF4Net 后面使用 NLog 并不是真正需要解决主要问题......
Thanks nemesv这对我有很大帮助
这是我最终使用的代码
顺便提一句。如果您愿意,您可以删除注入属性的代码,然后在所有类中使用 DI 来注入ILogger
这会提高性能
public class LoggingModule : Module
{
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry,
IComponentRegistration registration)
{
registration.Preparing += OnComponentPreparing;
registration.Activated += (sender, e) => InjectLoggerProperties(e.Instance);
}
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(ILogger) && p.CanWrite && p.GetIndexParameters().Length == 0);
// Set the properties located.
foreach (var propToSet in properties)
{
propToSet.SetValue(instance, LoggerFactory.GetLogger(instanceType), null);
}
}
private 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 (ILogger),
(p, i) => LoggerFactory.GetLogger(t))
});
}
}
然后注册模块:
containerBuilder.RegisterModule<LoggingModule>();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)