C# 获取请求Ninject服务的类名

C# 获取请求Ninject服务的类名,c#,ninject,nlog,C#,Ninject,Nlog,我正在提取NLog。到目前为止,我所拥有的 public interface IAppLogger { void Info(string message); void Warn(string message); void Error(string message, Exception error); void Fatal(string message); ....// other overload } 以及使用NLog实现IAppLogger publ

我正在提取NLog。到目前为止,我所拥有的

public interface IAppLogger
{
    void Info(string message);
    void Warn(string message);
    void Error(string message, Exception error);
    void Fatal(string message);
     ....// other overload
}
以及使用NLog实现IAppLogger

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();
    }
}
公共类程序
{
专用静态IAppLogger日志{get;set;}
私有静态void Main()
{
var kernel=新的标准内核();
Load(Assembly.getExecutionGassembly());
Log=kernel.Get();
Log.Info(“应用程序已启动”);
Log.Warn(“开发人员:无效日期格式”);
Error(“Divid by zero Error”,new divideby zero exception());
Console.WriteLine(“\n日志记录”);
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;
    }
}
公共类NinjectConfig:NinjectModule
{
公共覆盖无效负载()
{
将()绑定到()上
.WithConstructorArgument(“callerFilePath”,GetParentTypeName);
}
私有静态字符串GetParentTypeName(IContext上下文)
{
返回context.Request.ParentRequest.Service.FullName;
}
}
到目前为止还不错。但是当我运行应用程序时,对于context.Request.ParentRequest,Ninject不断返回NULL。我还尝试了context.Request.Target对于context.Request.Target,它仍然返回NULL。我做错了什么。请帮帮我

找到一个可能适合你的答案,试试看:

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));
    }
}
公共类NLogLogger:IAppLogger
{
专用只读NLog.Logger\u Logger;
公共NLogLogger(类型callerType)
{
_logger=NLog.LogManager.GetLogger(callerType.Name,callerType);
}
公共无效信息(字符串消息)
{
_logger.Info(消息);
}
公共无效警告(字符串消息)
{
_logger.Warn(消息);
}
……和其他
}
公共类NinjectConfig:NinjectModule
{
公共覆盖无效负载()
{
Bind().ToMethod(p=>newnloglogger(p.Request.Target.Member.DeclaringType));
}
}

请查看此项@dbugger所以我从您建议的链接中了解到,如果我通过IResolutionRoot.Get()访问Ninject服务,ParentContext或Target将为null,就像我在上面的控制台应用程序上所做的那样。知道了!!。非常感谢。但是有没有一种方法可以让获得注入的类使用IResolutionRoot通知自己到Ninject服务,这样ParentContext就不会为null“我正在抽象NLog”。这不是抽象,而是复制确切的API。考虑一下。“史提芬,谢谢。我喜欢你给我的链接上的答案。但是p.Request.Target仍然返回NULL。因为我通过IResolution.Get()显式请求服务,所以它一直返回null。