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

时间:2016-09-06 18:09:16

标签: c# dependency-injection 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>();
        }
    }
}

1 个答案:

答案 0 :(得分: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。

希望这有帮助。