C# 获取请求Ninject服务的类名
我正在提取NLog。到目前为止,我所拥有的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
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。