2012-12-06 6 views
12

Ich habe gerade angefangen Ninject lernen, aber ein Problem mit dem Logger stoßen. Ich habe zur Zeit einen Controller, der einen Dienst und Logger in den Konstruktor wie so injiziert hat:Ninject Logger mit NLog

public ToolsController(IToolsService toolsService, ILogger logger) 
{ 
    logger.Info("ToolsController Created"); 
    this.toolsService = toolsService; 
    this.logger = logger; 
} 

Das Problem auf der logger.Info Linie ist (zum Beispiel) in dem Konstruktor, die den falschen Logger zu verwenden scheinen , so ist der Logger-Name, der ausgedruckt wird, falsch.

Tools.IGeocodeImporter: ToolsController Created 

Unten ist, wie es Setup ist die Logger-Namen zu erhalten:

kernel.Bind<ILogger>().To<Logger>().WithConstructorArgument("name", x => x.Request.ParentContext.Request.Service.FullName); 

Jede Beratung geschätzt würde.

+0

Welche Logger Name, den Sie erwartet haben? –

+0

Der Klassenname von wo auch immer der Logger ist. Etwas in der Art von: 'ToolsController: ToolsController Created' – user1883004

Antwort

14

Ich benutze folgend:

.Bind<ILog>().ToMethod(p => LogManager.GetLogger(
        p.Request.Target.Member.DeclaringType)); 

die Logger zu haben, mit dem Namen der Klasse. Ich verwende Log4net, aber ich denke, dass die Idee auch auf jedes Protokoll angewendet werden kann: In der Tat, die Bindung an eine Methode öffnet Sie für jede Lösung, um die benötigte Instanz zu erstellen.

9

Ich benutze eine Ninject Erweiterung namens Ninject.Extensions.Logging.NLog2, die auf NuGet oder GitHub gefunden werden kann. Es behandelt die Bindung von NLog, so dass Sie nichts anderes tun müssen, als es nur zu Ihrem Projekt hinzuzufügen und alle Bindungen zu NLog zu entfernen, die Sie gerade haben.

+0

Wissen Sie, ob es Tutorials mit dieser Bibliothek gibt? –

+0

Überprüfen Sie diesen Link http://blog.tonysneed.com/2011/10/09/using-nlog-with-dependency-injection/ –

+0

Hier ist der Link zu der Erweiterung Wiki https://github.com/ninject/ ninject.extensions.logging/wiki – jmdon

0

Wie Felice erwähnt Sie die gleiche Methode verwenden können, jedoch für Nlog müssen Sie ein wenig ändern Bit, das ist:

würde
.Bind<ILogger>().ToMethod(p => NLog.LogManager.GetCurrentClassLogger(
        p.Request.Target.Member.DeclaringType));