使用Ninject将Log4Net注入控制台应用程序
本文关键字:控制台 应用程序 注入 Log4Net Ninject 使用 | 更新日期: 2023-09-27 18:05:49
是否有文章或完整的示例展示如何使用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>();
}
}
}
我是这样做到的…
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并开始记录。
但是,记录器现在总是以somenamspace . program命名。这将使识别从应用程序中的哪个位置写入日志变得困难。我能找到的最简单的解决方案是更改Log4Net配置并使用%C代替%logger。