Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NLog的Ninject记录器_C#_Ninject_Nlog - Fatal编程技术网

C# 使用NLog的Ninject记录器

C# 使用NLog的Ninject记录器,c#,ninject,nlog,C#,Ninject,Nlog,我刚开始学习Ninject,但遇到了记录器的问题。我目前有一个控制器,它将服务和记录器注入构造函数,如下所示: public ToolsController(IToolsService toolsService, ILogger logger) { logger.Info("ToolsController Created"); this.toolsService = toolsService; this.logger = logger; } 问题出在构造函数中的logg

我刚开始学习Ninject,但遇到了记录器的问题。我目前有一个控制器,它将服务和记录器注入构造函数,如下所示:

public ToolsController(IToolsService toolsService, ILogger logger)
{
    logger.Info("ToolsController Created");
    this.toolsService = toolsService;
    this.logger = logger;
}
问题出在构造函数中的logger.Info行(例如),它似乎使用了错误的记录器,因此它打印出的记录器名称不正确

Tools.IGeocodeImporter: ToolsController Created 
下面是获取记录器名称的设置方式:

kernel.Bind<ILogger>().To<Logger>().WithConstructorArgument("name", x => x.Request.ParentContext.Request.Service.FullName);
kernel.Bind().To().WithConstructorArgument(“name”,x=>x.Request.ParentContext.Request.Service.FullName);
如有任何建议,我将不胜感激。

我使用以下方法:

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

使记录器具有类的名称。我使用的是Log4net,但我认为这个想法也可以应用于任何日志:事实上,绑定到一个方法可以为您打开任何解决方案,以便创建所需的实例。

我使用一个名为ninject.Extensions.Logging.NLog2的ninject扩展,它可以在或上找到。它处理NLog的绑定,因此您无需做任何其他事情,只需将其添加到您的项目中,并删除您现在对NLog的任何绑定。

正如Felice提到的,您可以使用相同的方法,但是对于NLog,您需要做一点更改,即:

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

目前,所有答案都不正确。要做到这一点,你必须写:

_kernel.Bind<ILogger>().ToMethod(p => LogManager.GetLogger(p.Request.Target.Member.DeclaringType.FullName));
\u kernel.Bind().ToMethod(p=>LogManager.GetLogger(p.Request.Target.Member.DeclaringType.FullName));
但为了安全起见,我建议:

_kernel.Bind<ILogger>().ToMethod(p => LogManager.GetLogger(p.Request.Target?.Member.DeclaringType.FullName ?? typeof(App).GetType().FullName));
\u kernel.Bind().ToMethod(p=>LogManager.GetLogger(p.Request.Target?.Member.DeclaringType.FullName??typeof(App.GetType().FullName));

其中
应用程序
是您的启动类。

您期望的记录器名称是什么?记录器所在位置的类名。下面是:
ToolsController:ToolsController Created
您知道此库中是否有可用的教程吗?检查此链接此处是扩展wiki的链接有一个新版本,可用于Ninject 4.5.8+。Ninject.Extensions.Logging.NLog4.似乎对我有用-当然构建了记录器。但不幸的是,这会生成名称为常量的记录器,并且属于编写此语句的类。此答案帮助我在此处生成正确的代码: