2016-09-06 80 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。

希望这会有所帮助。

相关问题