2014-07-10 284 views
1

我已经在这个论坛中经历了一些与Ninject和Log4net相关的其他帖子,但似乎没有人解决这个问题(或解决它)。Ninject注入ILog依赖项

代码看起来像

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

的例外是在最后一行抛出以上消息“错误激活的ILog。没有匹配的绑定都可以......”

IFSLog是我组装定义的接口其实现了如下

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

项目引用Ninject.extensions.logging.log4net组装log4net的ILOG对象的依赖关系,所以我未理解是应该从那里确定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

这log4net的版本是你的'IFSLog'引用?它*可能是ninject扩展引用了不同的版本。 – BatteryBackupUnit

+0

log4net版本是1.2.13.0,ninject.extensions.logging.log4net是3.2.0.0。 作为解决方案,我添加了一个自定义ILogFactory接口,该接口具有GetLogger方法,该方法将调用LogManager.GetLogger,然后用此新接口替换IFSLog运行时依赖项。在各个类中,我通过调用ILogFactory.GetLogger来初始化ILog成员....虽然它起作用,但仍不确定为什么早期尝试没有。谢谢 – Firmusoft

+0

以及我只是想知道这是否是由ninject引起的。 extensions.logging.log4net(3.2.0.0)引用log4net 1.2.11,并引用不同的版本(1.2.13.0)。也许你可以降级到1.2.11,看看会发生什么? 我们曾经有类似log4net的问题。说实话,你使用ninject log4net日志扩展的目的是什么?这只是一堆简单的类(用于日志界面的包装..)+ 1或2个绑定,我只会推出自己的。 – BatteryBackupUnit

回答

2

事实证明,什么Ninject.Extensions.Logging.Log4Net和Ninject.Extensions.Logging.NLog提供的是Log4net和Nlog接口的抽象,所以你可以轻松将NLog与Log4Net互换。

这两个扩展只能创建一个绑定Ninject.Extensions.Logging.ILoggerFactoryNinject.Extensions.Logging.ILogger。所以这就是为什么没有ILog的约束力。

如果你注入​​而不是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>(); 
+0

非常感谢BBU的信息...... – Firmusoft

+0

欢迎您(接受/赞成答案:))。 – BatteryBackupUnit