Asp.net mvc Ninject.Extensions.Logging.nlog2-如何?

Asp.net mvc Ninject.Extensions.Logging.nlog2-如何?,asp.net-mvc,ninject,nlog,asp.net-mvc-3,Asp.net Mvc,Ninject,Nlog,Asp.net Mvc 3,浏览努吉图书馆时,我偶然发现。我在谷歌上搜索了一下,试图弄明白一些事情,但我似乎找不到您使用此扩展的方式或原因 建议与MVC 3一起使用吗 到底是什么意思 你如何使用它?它真的很简单;NLog和log4net都希望您使用单例/静态引用来获取记录器实例: private static Logger logger = LogManager.GetCurrentClassLogger(); 这被广泛认为是一种反模式,但是即使您对它没有问题,如果您试图实现依赖注入,它仍然是违反规则的。在NLog的情况

浏览努吉图书馆时,我偶然发现。我在谷歌上搜索了一下,试图弄明白一些事情,但我似乎找不到您使用此扩展的方式或原因

建议与MVC 3一起使用吗

到底是什么意思


你如何使用它?

它真的很简单;NLog和log4net都希望您使用单例/静态引用来获取记录器实例:

private static Logger logger = LogManager.GetCurrentClassLogger();
这被广泛认为是一种反模式,但是即使您对它没有问题,如果您试图实现依赖注入,它仍然是违反规则的。在NLog的情况下,它甚至不是像log4net那样的
ILog
ILogger
接口,而是一个实际的类。这带来了某些缺点,例如无法创建代理、延迟加载、缓存等

Ninject.Extensions.Logging项目所做的是首先提供一个抽象的
ILogger
类,该类具有简单的方法,如
Info
Error
等,因此您可以将其作为依赖项注入,并根据需要切换日志框架:

public class WidgetProvider
{
    private readonly ILogger log;

    public WidgetProvider(ILogger log)
    {
        this.log = log;
    }
}
这就是DI应该如何工作的——一个类从不去获取它自己的依赖项,相反,它们是由构造函数或调用方提供的,如上所述。假设您已经将Ninject本身集成到您的项目中,这就是您真正需要做的所有事情,没有额外的工作

至于Ninject.Extensions.Logging.NLog2的具体功能,它只提供了基于NLog2的Ninject.Extensions.Logging的实现。基本日志库实际上不包含任何
ILogger
的实现,您必须插入其中一个特定库(NLog、NLog2或log4net)才能使其工作


如果您切换DI库的频率比切换记录器的频率更高,那么就不用麻烦了。但是,如果您像我一样,几乎在每个项目中都使用Ninject,那么将代码与任何特定的日志库分离是一种很好的方法。

如果您想通过构造函数使用依赖项注入,可以传递iLogger工厂接口

我就是这样做的

using Ninject.Extensions.Logging;
public class MyClass
{
    private readonly ILogger _log;

    public MyClass(ILoggerFactory logFactory)
    {
        _log = logFactory.GetCurrentClassLogger();
    }

    public void DoWork()
    {
        _log.Info("Doing work!");
    }
}
问题解决了


希望这有助于他人。

即使在这里,似乎也有一些人在使用它:@Taesung Shin-好吧,考虑到最新的信息已经有一年多的历史了,Ninject、MVC和各种项目在这段时间内都有了显著的增长。。。我正在寻找更多的最新信息。谢谢,回答得很好。我发现连基本的描述都没有,这让我很困惑。