Ninject注入ILog依赖

时间:2014-07-10 02:01:31

标签: ninject log4net

我已经浏览了本论坛中与Ninject和Log4net相关的其他帖子,但似乎都没有解决问题(或解决它)。

代码看起来像

IKernel kernel = new StandardKernel(new NinjectSettings() { LoadExtensions = true }); 
kernel.Load(Assembly.GetExecutingAssembly());
Program pgm = new Program(kernel.Get<IFSLog>());

在上一行中抛出异常,并显示消息“错误激活ILog。没有匹配的绑定可用...”

IFSLog是我的程序集中定义的接口,它的实现依赖于log4Net Ilog对象,如下所示

public class Log4NetLog : IFSLog {
  private ILog logger;
  public Log4NetLog(ILog log) {
    this.logger = log;
  }
  ...
}

该项目引用了Ninject.extensions.logging.log4net程序集,因此我的理解是应该从那里识别ILog绑定。

还尝试了手动指定绑定的替代方法

public class Bindings : NinjectModule {
    public override void Load() {
        Bind<IFSLog>().To<Log4NetLog>();
    }
}

并将内核初始化为

IKernel kernel = new StandardKernel(new NinjectSettings() { LoadExtensions = false }, 
  new INinjectModule[] {new Bindings(), new Log4NetModule()});

仍然是相同的结果。任何帮助非常感谢,提前感谢...

1 个答案:

答案 0 :(得分:2)

事实证明,Ninject.Extensions.Logging.Log4Net和Ninject.Extensions.Logging.NLog提供的是Log4net和Nlog接口的抽象,因此您可以轻松地将NLog与Log4Net交换。

这两个扩展程序仅为Ninject.Extensions.Logging.ILoggerFactoryNinject.Extensions.Logging.ILogger创建绑定。这就是ILog没有约束力的原因。

如果您将ILogger而不是ILog注入Log4NetLog : IFSLog,它就可以正常工作。

或者您可以跳过使用ninject扩展并自行连接并直接使用log4net ILog界面(您使用IFSLog的是什么?)。

我们曾经直接使用log4net ILog并简化了这样的事情:

internal class LogProvider : Provider<ILog>
{
    protected override ILog CreateInstance(IContext context)
    {
        Type typeLoggerIsInjectedInto = context.Request.ParentContext.Plan.Type;
        return LogManager.GetLogger(typeLoggerIsInjectedInto);
    }
}

IKernel.Bind<ILog>().ToProvider<LogProvider>();