如何使用 LightInject 注入 class-specific logger?
How can I inject class-specific logger using LightInject?
许多日志记录框架提供 class 特定的记录器:
NLog: Logger.GetLogger(typeof(MyClass).Name)
序列日志:Log.Logger.ForContext<MyClass>()
为了能够注入这些 class 特定的记录器,可以在 Ninject 中做这样的事情:
Bind<ILog>().ToMethod(context =>
{
var typeForLogger = context.Request.Target != null ? context.Request.Target.Member.DeclaringType : context.Request.Service;
return context.Kernel.Get<ILoggerFactory>().GetLogger(typeForLogger);
});
其中 context.Request.Target
提供将接收注入的类型。
我找不到任何方法来使用 LightInject 做同样的事情;不支持此功能(还)吗?
原来有人遇到了同样的问题:https://github.com/seesharper/LightInject/issues/186
基本上,解决方案是使用将 class 名称作为构造函数参数的记录器 class:
public interface ILog
{
void Debug(string message, params object[] args);
}
public class SeriLogger : ILog
{
static SeriLogger ()
{
LoggerConfig = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Trace();
}
private readonly ILogger logger;
private static readonly LoggerConfiguration LoggerConfig;
public SeriLogger(Type type)
{
logger = LoggerConfig.CreateLogger().ForContext(type);
}
public void Debug(string message, params object[] args)
{
logger.Debug(message, args);
}
}
然后使用 RegisterConstructorDependency
:
注册记录器
// Wherever you register your types
container.RegisterConstructorDependency<ILog>((factory, info) => new SeriLogger(info.Member.DeclaringType));
许多日志记录框架提供 class 特定的记录器:
NLog: Logger.GetLogger(typeof(MyClass).Name)
序列日志:Log.Logger.ForContext<MyClass>()
为了能够注入这些 class 特定的记录器,可以在 Ninject 中做这样的事情:
Bind<ILog>().ToMethod(context =>
{
var typeForLogger = context.Request.Target != null ? context.Request.Target.Member.DeclaringType : context.Request.Service;
return context.Kernel.Get<ILoggerFactory>().GetLogger(typeForLogger);
});
其中 context.Request.Target
提供将接收注入的类型。
我找不到任何方法来使用 LightInject 做同样的事情;不支持此功能(还)吗?
原来有人遇到了同样的问题:https://github.com/seesharper/LightInject/issues/186
基本上,解决方案是使用将 class 名称作为构造函数参数的记录器 class:
public interface ILog
{
void Debug(string message, params object[] args);
}
public class SeriLogger : ILog
{
static SeriLogger ()
{
LoggerConfig = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Trace();
}
private readonly ILogger logger;
private static readonly LoggerConfiguration LoggerConfig;
public SeriLogger(Type type)
{
logger = LoggerConfig.CreateLogger().ForContext(type);
}
public void Debug(string message, params object[] args)
{
logger.Debug(message, args);
}
}
然后使用 RegisterConstructorDependency
:
// Wherever you register your types
container.RegisterConstructorDependency<ILog>((factory, info) => new SeriLogger(info.Member.DeclaringType));