【问题标题】:Injecting ILogger using Ninject, Log4Net, and Nancy使用 Ninject、Log4Net 和 Nancy 注入 ILogger
【发布时间】:2017-10-19 00:51:23
【问题描述】:

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

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

一些上下文:

在这个应用程序中,我们构造了一个单一的ninject StandardKernel,它会自动加载Ninject.Extensions.Logging提供的Log4NetModule

我们的 Nancy Bootstrapper 类使用 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 调用增加相当多的开销(响应时间几乎加倍)。

也许我完全错误地处理了这个问题,但我想知道是否有人对此问题有建议和/或解决方案。

谢谢。

【问题讨论】:

    标签: c# .net ninject log4net nancy


    【解决方案1】:

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

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

    【讨论】:

    • 这是一个很好的建议,但在这种情况下,我希望获得一个记录器实例(每种类型 1 个或每个请求 1 个,而不会产生 XML 加载开销)。我最终能够一次运行 XML 加载。看来问题归结为每个请求都会产生一个子容器。我添加了一些自定义逻辑,以使我的 nancy 请求处理程序从父 IoC 容器中检索日志记录依赖项,现在它似乎具有所需的行为
    猜你喜欢
    • 2015-01-10
    • 2022-01-18
    • 2014-06-23
    • 1970-01-01
    • 2011-10-19
    • 2022-11-02
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    相关资源
    最近更新 更多