2016-09-06 79 views
0

是否有文章或完整示例顯示如何使用ninject將Log4Net注入器注入控制檯應用程序?到目前爲止,我已經設法在主模塊中創建一個新實例,但無法弄清楚如何注入。以下是我有的設置。使用Ninject將Log4Net注入控制檯應用程序

編輯:以爲我會加上這樣做的原因了。我想將記錄器注入其他類中進行日誌記錄。

using System; 
using System.Reflection; 
using Ninject; 
using Ninject.Modules; 

namespace SomeNameSpace 
{ 
    public class MyProgram 
    { 
     public static void Main(string[] args) 
     { 
      log4net.Config.BasicConfigurator.Configure(); 
      log4net.ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

      try 
      { 
       log.Info("Application - Start"); 

       Initialiase(); 

       _something.DoSomething(); 

       log.Info("Application - End"); 
      } 
      catch (Exception ex) 
      { 
       log.Error("Application failed", ex); 
      } 
     } 

     private static void Initialiase() 
     { 
      var kernel = new StandardKernel(); 
      kernel.Load(Assembly.GetExecutingAssembly()); 
      _something = kernel.Get<ISomething>(); 
     } 
    } 

    public class Bindings : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<ISomething>().To<Something>(); 
     } 
    } 
} 
+0

我看不到你使用'Bindings'對象的地方......它是否來自'kernel.Load()'調用,如果是,它實際上是在運行你的Load()方法嗎? – Brandon

+0

是的,Bindings.Load()覆蓋NinjectModule.Load()。是的,它運行我的Bindings.Load()方法。 –

回答

0

我這是怎麼實現的吧...

using System; 
using System.Reflection; 
using Ninject; 
using log4net; 

namespace SomeNameSpace 
{ 
    public class MyProgram 
    { 
     private static ILog _log; 

     public static void Main(string[] args) 
     { 
      try 
      { 
       Initialiase(); 

       _log.Info("Application - Start"); 

       _something.DoSomething(); 

       _log.Info("Application - End"); 
      } 
      catch (Exception ex) 
      { 
       _log.Error("Application failed", ex); 
      } 
     } 

     private static void Initialiase() 
     { 
      var kernel = new StandardKernel(); 
      kernel.Load(Assembly.GetExecutingAssembly()); 
      _log = kernel.Get<ILog>(); 
      _something = kernel.Get<ISomething>(); 
     } 
    } 

    public class Bindings : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<ILog>().ToMethod(c => LogManager.GetLogger(typeof(Program))).InSingletonScope(); 
      Bind<ISomething>().To<Something>(); 
     } 
    } 
} 

現在我可以DI ILog的,並開始記錄。

但是,記錄器現在總是有名稱SomeNameSpace.Program。這將很難確定日誌在應用程序中的寫入位置。我能找到的最簡單的解決方案是更改Log4Net配置並使用%C代替%logger。

希望這會有所幫助。

相關問題