如何使用LightInject注入特定于类的记录器?

时间:2015-10-02 13:38:18

标签: c# dependency-injection light-inject

许多日志记录框架提供特定于类的记录器:

NLog:Logger.GetLogger(typeof(MyClass).Name)

Serilog:Log.Logger.ForContext<MyClass>()

为了能够注入这些特定于类的记录器,可以在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做同样的事情;是否尚未支持此功能?

1 个答案:

答案 0 :(得分:0)

原来其他人遇到同样的问题:https://github.com/seesharper/LightInject/issues/186

基本上,解决方案是使用一个记录器类,它将类名作为构造函数参数:

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));