2016-09-06 8 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

これは私が今...私はそれを達成する方法DIのILog

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>(); 
     } 
    } 
} 

ができているとロギングを開始。

ただし、ロガーの名前は常にSomeNameSpace.Programです。これにより、ログがアプリケーション内でどこから書き込まれるのかを特定することが困難になります。私が見つけた最も簡単な解決策はLog4Netの設定を変更し、%loggerの代わりに%Cを使うことでした。

これが役に立ちます。