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