15

我刚刚开始学习 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);

任何意见,将不胜感激。

4

4 回答 4

19

我使用以下内容:

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

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

于 2012-12-06T17:06:36.150 回答
9

我使用了一个名为 Ninject.Extensions.Logging.NLog2 的 ninject 扩展,它可以在NuGetGitHub 上找到。它处理 NLog 的绑定,因此您只需将其添加到您的项目并删除您现在拥有的任何与 NLog 的绑定即可。

于 2012-12-19T07:28:30.163 回答
2

正如 Felice 提到的,您可以使用相同的方法,但是对于 Nlog,您需要进行一些更改,即:

.Bind<ILogger>().ToMethod(p => NLog.LogManager.GetCurrentClassLogger(
                   p.Request.Target.Member.DeclaringType));
于 2018-02-27T05:53:09.630 回答
0

我认为目前最好的方法是为您的记录器(用于 NLog)安装扩展:

Install-Package Ninject.Extensions.Logging.NLog4

然后在你的代码中:

 using var kernel = new Ninject.StandardKernel(new NinjectSettings(){LoadExtensions = false}, new NLogModule());

new NinjectSettings(){LoadExtensions = false}- 这个元素是正确加载 NLogModule 所必需的。

现在您已准备好获取以下新实例ILogger

public class PublicPropertyLoggerClass
{
    [Inject]
    public Ninject.Extensions.Logging.ILogger Logger { get; set; }
}

但是如果你不喜欢安装新的 nuget 包,你仍然可以使用:

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

App你的创业课程在哪里。

答案基于:https ://github.com/ninject/Ninject.Extensions.Logging/wiki/Using

于 2021-01-19T18:38:55.923 回答