2014-07-10 281 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