2011-08-17 10 views
12

Przeglądając bibliotekę nugetów, natrafiłem na Ninject.Extensions.Logging.nlog2. Niektórzy szukają i szukają informacji, ale nie mogę znaleźć odpowiedzi na pytanie, jak i dlaczego użyć tego rozszerzenia.Ninject.Extensions.Logging.nlog2 - Jak?

Czy warto używać z MVC 3?

O co dokładnie chodzi?

Jak tego używasz?

+0

Wydaje kilka osób go używać nawet w tutaj: http://groups.google.com/group/ninject/search?group=ninject&q=nlog&qt_g=Search+this+group –

+0

@Taesung Shin - Cóż, biorąc pod uwagę najnowsza wiadomość ma ponad rok, a projekty Ninject, MVC i różne znacznie wzrosły w tym czasie ... Szukam bardziej aktualnych informacji. –

Odpowiedz

17

To naprawdę bardzo proste; zarówno NLog i log4net oczekiwać, aby używać singleton/referencje statycznych do uzyskania instancji Rejestrator:

private static Logger logger = LogManager.GetCurrentClassLogger(); 

ten jest powszechnie uważany za anty-wzór, ale nawet jeśli nie masz z tym problem, to nadal będzie przeciw ziarno, jeśli próbujesz wdrożyć wtrysk zależności. W przypadku NLog nie jest to nawet interfejs ILog lub ILogger, taki jak log4net, to rzeczywista klasa. Które niesie pewne wady, takie jak niemożność stworzenia proxy, odroczone obciążenia, buforowanie itp

Co projekt Ninject.Extensions.Logging nie jest pierwszym dostarczyć streszczenie ILogger klasy z prostych metod, takich jak Info, Error itp więc można wstrzyknąć go jako zależność i przełączyć ram rejestrowania, jeśli chcesz:

public class WidgetProvider 
{ 
    private readonly ILogger log; 

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

ten sposób DI ma pracować - klasa nigdy nie wychodzi chwycić własne zależności, a nie są one dostarczane przez konstruktor lub dzwoniący jak wyżej. Zakładając, że już zintegrowałeś program Ninject ze swoim projektem, to naprawdę musisz zrobić, to nie ma dodatkowej pracy.

Jeśli chodzi o to, co Ninject.Extensions.Logging.NLog2 ma , konkretnie - zapewnia jedynie implementację Ninject.Extensions.Logging na podstawie NLog2. Podstawowa biblioteka Logging w rzeczywistości nie zawiera żadnych implementacji ILogger, musisz podłączyć jedną z konkretnych bibliotek (NLog, NLog2 lub log4net), aby uruchomić ją.

Jeśli zmienisz bibliotekę DI częściej niż przełączasz rejestratory, nie przejmuj się tym. Ale jeśli jesteś podobny do mnie i używaj programu Ninject w prawie każdym projekcie, to jest to dobry sposób na oddzielenie kodu od dowolnej biblioteki logowania.

+0

Dzięki, świetna odpowiedź. Brak nawet podstawowego opisu był tak mylący. –

0

Jeśli chcesz użyć iniekcji zależności za pośrednictwem konstruktora, możesz przekazać interfejs ILoggerFactory.

Tak to zrobiłem.

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

Problem rozwiązany!

Mam nadzieję, że to komuś pomaga.