2016-05-18 6 views
0

Я отвлекаю NLog. До сих пор, что у меня есть ...получить имя класса, которое запросило услугу Ninject

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

И реализация IAppLogger с использованием 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 
} 

И консольное приложение, которое использует эту службу

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(); 
    } 
} 

И инъекции зависимостей, используя 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; 
    } 
} 

пока все хорошо. Но когда я запускаю приложение, Ninject продолжает возвращать NULL для context.Request.ParentRequest. Я также пробовал это с context.Request.Target ........ Еще он возвращает NULL для context.Request.Target. Что я делаю не так. Помогите мне, пожалуйста !!!!

+0

Проверьте это ... http://stackoverflow.com/questions/30457623/how-to-get-implementing -type-in-ninject-dependency-resolve – dbugger

+0

@dbugger Итак, я понял из ссылки, которую вы предположили, что ParentContext или Target будет null, если я обратился к службе Ninject через IResolutionRoot.Get (), как это было в приложении консоли выше , ПОНЯЛ!!. Большое спасибо. – ash

+0

Но есть ли способ, чтобы класс, который получил инъекцию, чтобы уведомить об этом себя в службу Ninject с помощью IResolutionRoot, чтобы ParentContext не был пустым – ash

ответ

0

Найден ответ here, который может работать для вас, дать этому попытку:

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

Но еще p.Request.Target возвращает NULL. Потому что я прошу услугу явно через IResolution.Get (), он продолжает возвращать null. – ash

 Смежные вопросы

  • Нет связанных вопросов^_^