Ninject.Extensions.Logging.nlog2 - 怎么样?

Eri*_*sch 12 asp.net-mvc ninject nlog asp.net-mvc-3

浏览nuget库,我遇到了Ninject.Extensions.Logging.nlog2.一些谷歌搜索并试图解决问题,我似乎无法找到你如何或为什么要使用这个扩展.

是否可以与MVC 3一起使用?

究竟是什么意思?

你如何使用它?

Aar*_*ght 17

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

private static Logger logger = LogManager.GetCurrentClassLogger();
Run Code Online (Sandbox Code Playgroud)

这被广泛认为是一种反模式,但即使你没有问题,如果你试图实现依赖注入,它仍然会反对.在NLOG的情况下,它甚至不是一个ILogILogger像log4net的接口,它是一个真正的类.这带来了某些缺点,例如无法创建代理,延迟加载,缓存等.

什么Ninject.Extensions.Logging项目所做的就是首先提供一个抽象ILogger类用简单的方法,例如Info,Error等等,让你可以注入它作为一个依赖,并切换日志框架,如果你想:

public class WidgetProvider
{
    private readonly ILogger log;

    public WidgetProvider(ILogger log)
    {
        this.log = log;
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是DI应该如何工作 - 一个类永远不会去寻找自己的依赖,而是由构造函数或调用者提供,如上所述.假设你已经将Ninject本身集成到你的项目中,那真的你所要做的,没有额外的工作.

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

如果您比切换记录器更频繁地切换DI库,那么请不要理会它.但是,如果你像我一样并且几乎在每个项目中使用Ninject,那么这是将代码与任何特定日志库分离的好方法.