Ninject注入ILog依赖

我已经在这个论坛上看到了一些与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()});

还是一样的结果。 任何帮助非常感谢,预先感谢...


事实证明,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>();
链接地址: http://www.djcxy.com/p/66275.html

上一篇: Ninject to inject ILog dependency

下一篇: Request scope has already been disposed