【问题标题】:Weird exception when trying to use Dependency Injection in an Azure Function尝试在 Azure 函数中使用依赖注入时出现奇怪的异常
【发布时间】:2019-07-20 21:50:16
【问题描述】:

给定一个文件->新建->Azure Functions v2 应用程序,我正在尝试获取对 ILoggerFactoryILogger<T> 的引用。

我在函数应用启动时运行的 StartUp.cs 类中执行此操作。

给定以下代码,抛出一个奇怪的异常:

var serviceProvider = builder.Services.BuildServiceProvider();
var loggerFactory = serviceProvider.GetService<ILoggerFactory>();         

以下例外:

 A host error has occurred
[27/02/2019 8:21:22 AM] Microsoft.Extensions.DependencyInjection: Unable to resolve service for type 'Microsoft.Azure.WebJobs.Script.IFileLoggingStatusManager' while attempting to activate 'Microsoft.Azure.WebJobs.Script.Diagnostics.HostFileLoggerProvider'.
Value cannot be null.
Parameter name: provider

发生了什么事?

完整的测试仓库/代码可以是found here on GitHub

【问题讨论】:

  • 我遇到了同样的错误,但是在我为 Azure 函数注入的服务中,函数的执行很好。你能解决这个问题吗?
  • 这里也一样。您能找出导致此错误消息的原因吗?
  • 你找到你的问题了吗@AnthonyPotts?我刚刚将一个函数从 V2 升级到 V3,现在这个问题也很好地进入了函数的执行
  • @Adrian 不,我最终使用了我从几篇博文中手工制作的 IOC。
  • 我们在尝试访问 Startup 中的记录器时遇到了同样的问题。我们最终注册了两次,一次在记录器工厂内:var loggerFactory = LoggerFactory.Create(loggingBuilder =&gt; // register your loggers for use in Startup here again);

标签: asp.net-core dependency-injection .net-core azure-functions


【解决方案1】:

在您创建依赖注入容器并尝试解析 StartUp 类中的记录器时,似乎尚未设置 HostFileLoggerProvider 所需的某些基础架构(例如 IFileLoggingStatusManager)。我认为您应该将日志记录延迟到应用程序完全启动之后。

如果您查看 WebJobs 的启动代码,您会看到添加了记录器 first,然后添加了 the external startup gets executed,最后添加了 required logging services。哪个顺序不适合您的情况。

【讨论】:

  • Henk:您知道这种情况的解决方法吗?我希望能够将 ILogger 注入到在 Startup (builder.Services.AddSingleton...) 中引导的依赖项中,最好作为我的 Azure Function 中启动的一部分
  • 根据this:“您不能在服务初始化期间请求 ILogger - 一些记录器此时尚未注册所有依赖项。”在this post 中建议改用Humble Objects 设计模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多