使用 Ninject 将 Log4Net 注入控制台应用程序

Inject Log4Net into console application using Ninject

是否有文章或完整示例说明如何使用 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 并开始记录了。

但是,记录器现在始终具有名称 SomeNameSpace.Program。这将很难确定日志是从应用程序中的何处写入的。我能找到的最简单的解决方案是更改 Log4Net 配置并使用 %C 代替 %logger。

希望对您有所帮助。