2016-05-18 12 views
0

Ich abstrahiere weg NLog. Bisher, was ich habe ...erhalten Sie den Klassennamen, der Ninject Service angefordert

public interface IAppLogger 
{ 
    void Info(string message); 
    void Warn(string message); 
    void Error(string message, Exception error); 
    void Fatal(string message); 
    ....// other overload 
} 

Und eine Implementierung von IAppLogger mit NLog

public class NLogLogger : IAppLogger 
{ 
    private readonly NLog.Logger _logger; 

    public NLogLogger([CallerFilePath] string callerFilePath = "") 
    { 
     _logger = NLog.LogManager.GetLogger(callerFilePath); 
    } 

    public void Info(string message) 
    { 
     _logger.Info(message); 
    } 

    public void Warn(string message) 
    { 
     _logger.Warn(message); 
    } 
    .....// and others 
} 

und Konsole-Anwendung, die diesen Dienst verwendet

public class Program 
{ 
    private static IAppLogger Log { get; set; } 

    private static void Main() 
    { 
     var kernel = new StandardKernel(); 
     kernel.Load(Assembly.GetExecutingAssembly()); 
     Log = kernel.Get<IAppLogger>(); 

     Log.Info("Application Started"); 
     Log.Warn("Developer: Invalid date format"); 
     Log.Error("Divid by zero error", new DivideByZeroException()); 

     Console.WriteLine("\nDone Logging"); 
     Console.ReadLine(); 
    } 
} 

Und eine Abhängigkeit Injection mit Ninject

public class NinjectConfig : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IAppLogger>().To<NLogLogger>() 
     .WithConstructorArgument("callerFilePath", GetParentTypeName); 
    } 

    private static string GetParentTypeName(IContext context) 
    { 
     return context.Request.ParentRequest.Service.FullName; 
    } 
} 

so weit so gut. Aber wenn ich die Anwendung ausführe, gibt Ninject immer NULL für context.Request.ParentRequest zurück. Ich versuchte es auch mit context.Request.Target ........ Noch gibt es NULL für context.Request.Target. Was mache ich falsch. Hilf mir bitte!

+0

Check this out ... http://stackoverflow.com/questions/30457623/how-to-get-implementing -type-when-ninject-dependency-resolve – dbugger

+0

@dbugger Also, was ich verstehe von dem Link, den Sie vorgeschlagen, ist, dass ParentContext oder Ziel wird Null, wenn ich Ninject Service durch IResolutionRoot.Get () wie ich oben in der Konsole Anwendung zugegriffen habe . ICH HABS!!. Vielen Dank. – ash

+0

Aber gibt es eine Möglichkeit, dass eine Klasse, die die Injektion erhält, sich an den Ninject-Dienst unter Verwendung von IResolutionRoot zu benachrichtigen, damit ParentContext nicht null ist – ash

Antwort

0

Gefunden eine Antwort here, die für Sie arbeiten kann, geben diesem einen Versuch:

public class NLogLogger : IAppLogger 
{ 
    private readonly NLog.Logger _logger; 

    public NLogLogger(Type callerType) 
    { 
     _logger = NLog.LogManager.GetLogger(callerType.Name,callerType); 
    } 

    public void Info(string message) 
    { 
     _logger.Info(message); 
    } 

    public void Warn(string message) 
    { 
     _logger.Warn(message); 
    } 
    .....// and others 
} 

public class NinjectConfig : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IAppLogger>().ToMethod(p => new NLogLogger(p.Request.Target.Member.DeclaringType)); 
    } 
} 
+0

Aber immer noch p.Request.Target gibt NULL zurück. Da ich den Dienst explizit über IResolution.Get () frage, wird immer Null zurückgegeben. – ash