2011-08-17 11 views
12

Al navegar por la biblioteca nuget, me encontré con Ninject.Extensions.Logging.nlog2. Algunos buscando en Google y tratando de resolver las cosas, parece que no puedo encontrar cómo o por qué usar esta extensión.Ninject.Extensions.Logging.nlog2 - ¿Cómo?

¿Es recomendable usar con MVC 3?

¿Cuál es exactamente el punto?

¿Cómo se usa?

+0

Parece que algunas personas lo usan incluso aquí: http://groups.google.com/group/ninject/search?group=ninject&q=nlog&qt_g=Search+this+group –

+0

@Taesung Shin - Bueno, teniendo en cuenta la El mensaje más nuevo tiene más de un año de antigüedad y Ninject, MVC y varios proyectos han crecido significativamente en ese tiempo ... Estoy buscando información más reciente. –

Respuesta

17

Es realmente muy simple; tanto Nlog y log4net esperan que utiliza simples referencias/estáticos para obtener instancias logger:

private static Logger logger = LogManager.GetCurrentClassLogger(); 

Esto es ampliamente considerado como un anti-patrón, pero incluso si usted no tiene ningún problema con él, que todavía va en contra de la grano si está tratando de implementar la inyección de dependencia. En el caso de NLog, ni siquiera es una interfaz ILog o ILogger como log4net, es una clase real. Eso conlleva ciertos inconvenientes tales como la incapacidad para crear proxies, carga diferida, el almacenamiento en caché, etc.

Lo que el proyecto no es Ninject.Extensions.Logging primera proporcionar una clase abstracta ILogger con métodos simples como Info, Error, etc., por lo que se puede inyectar como una dependencia y cambiar el marco de registro si desea:

public class WidgetProvider 
{ 
    private readonly ILogger log; 

    public WidgetProvider(ILogger log) 
    { 
     this.log = log; 
    } 
} 

Esta es la forma en que se supone que trabajar DI - una clase nunca se va a agarrar sus propias dependencias, sino que están suministrados por el constructor o el que llama como se indica arriba. Suponiendo que ya ha integrado Ninject en su proyecto, eso es realmente todo que tiene que hacer, no hay trabajo adicional.

En cuanto a lo que Ninject.Extensions.Logging.NLog2 hace específicamente - solo proporciona una implementación para Ninject.Extensions.Logging basado en NLog2. La biblioteca de registro base en realidad no contiene ninguna implementación de ILogger, debe conectar una de las bibliotecas específicas (NLog, NLog2 o log4net) para que funcione.

Si cambia su biblioteca DI con más frecuencia de la que conmuta los registradores, entonces no se moleste con ella. Pero si eres como yo y usas Ninject en casi todos los proyectos, entonces es una buena forma de desacoplar tu código de cualquier biblioteca de registro específica.

+0

Gracias, gran respuesta. La falta de una descripción básica fue lo que encontré tan confuso. –

0

Si desea utilizar la inyección de dependencia mediante el constructor, puede pasar la interfaz de ILoggerFactory.

Así es como lo hice.

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!"); 
    } 
} 

¡Problema resuelto!

Espero que esto ayude a alguien.

Cuestiones relacionadas