我已经浏览了本论坛中与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()});
仍然是相同的结果。任何帮助非常感谢,提前感谢...
答案 0 :(得分:2)
事实证明,Ninject.Extensions.Logging.Log4Net和Ninject.Extensions.Logging.NLog提供的是Log4net和Nlog接口的抽象,因此您可以轻松地将NLog与Log4Net交换。
这两个扩展程序仅为Ninject.Extensions.Logging.ILoggerFactory
和Ninject.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>();