使用 Ninject、Log4Net 和 Nancy 注入 ILogger

Injecting ILogger using Ninject, Log4Net, and Nancy

我目前正在使用一个使用 Ninject、Log4Net 和 Nancy 的应用程序。

我遇到的问题是确定将 Web.config 提供的 Log4Net 配置持久保存到 ILogger 的所有注入实例的最佳方法。

一些上下文:

在此应用程序中,我们构建了一个 ninject StandardKernel,它会自动加载 Ninject.Extensions.Logging

提供的 Log4NetModule

我们的 Nancy Bootstrapper class 使用 this project

NinjectNancyBootstrapper 继承

使用上述方法,我们能够成功解决以下问题属性:

/// <summary>
/// Injected Logger
/// </summary>
[Inject]
public ILogger Logger { get; set; }

这依赖于我们 Web.config 中提供的 Log4Net 配置。

就在创建静态 StandardKernel 之前,我们正在执行 XmlConfigurator:

log4net.Config.XmlConfigurator.Configure();
_kernel = new StandardKernel();

根据我的理解,在创建任何 ILogger 实例之前,只需要在应用程序中调用一次此配置器(诚然这可能是不正确的)。启动我的应用程序后,注入的第一个 ILogger 实例包含了我期望的附加程序。每个后续调用仍能成功解决依赖关系,但缺少第一个配置的附加程序。这里是否存在 XmlConfigurator 仅适用于创建的第一个 ILogger 的预期行为?虽然这在为整个应用程序使用单个 ILogger 的情况下肯定有效,但我希望每种类型至少有一个。

我最初尝试解决此问题的其中一个尝试是将 XMLConfigurator 附加到 RequestStartup 方法中,但给我们的 API 调用增加了相当多的开销(响应时间几乎加倍)。

也许我完全错误地解决了这个问题,但我想知道是否有人有建议and/or解决这个问题的方法。

谢谢。

您只需要在 Ninject 中将 ILogger 注册为单例服务 像这样:

kernel.Bind<ILogger>.To<LoggerConstructor>().InSingletonScope();