0

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

日志: Logger.GetLogger(typeof(MyClass).Name)

串行日志: 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);
        });

wherecontext.Request.Target提供将接收注入的类型。

我找不到任何使用 LightInject 的方法来做同样的事情;(尚)不支持此功能吗?

4

1 回答 1

1

原来其他人也有同样的问题: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));
于 2015-10-02T14:50:00.940 回答