c# - 间歇性依赖注入(inject)失败

标签 c# azure dependency-injection azure-functions

当我尝试解析 .net core 2.1 azure 函数应用程序中的服务时,我在本地看到以下间歇性异常。它似乎仅在该函数同时处理多个消息时才会发生,并且仅使某些消息失败。

'System.Private.CoreLib: Exception while executing function: FunctionOne. Microsoft.Extensions.DependencyInjection: Unable to resolve service for type 'Microsoft.Extensions.Configuration.IConfiguration' while attempting to activate 'XXX.Service2'.

当服务与函数位于同一项目中时,一切正常。只有当我将其移至另一个项目时才会发生这种情况。我创建的另一个项目只是一个简单的 .net 标准 2.0 项目,其中仅包含此服务以及对 Microsoft.Extensions.Configuration nuget 的引用。

我知道此实现使用了服务定位器,这是一种反模式,但我仍然想了解为什么会发生此异常。

[FunctionName("FunctionOne")]
public static void Run(
    [QueueTrigger(_queue, Connection = _storageConnection)]
    string queueItem,
    ILogger trace)
{
    // Startup
    var services = Startup.GetServices();

    // Services
    var service = services.GetService<IService2>();
}
public static class Startup
{
    public static Func<IServiceProvider> GetServices = CreateServices;

    public static IConfiguration GetConfiguration()
    {
        return new ConfigurationBuilder()
             .AddEnvironmentVariables()
             .Build();
    }

    private static IServiceProvider CreateServices()
    {
        var services = new ServiceCollection();

        var config = GetConfiguration();

        services
            .AddSingleton(config)
            .AddSingleton<IService2, Service2>();

        return services.BuildServiceProvider();
    }
}
public class Service2 : IService2
{
    public Service2(IConfiguration configuration)
    {
    }
}
public interface IService2
{
}

最佳答案

尝试将其作为 IConfigurationRoot 而不是 IConfiguration 注入(inject):

public HomeController(IConfigurationRoot configuration
    , IService2 service)
{
    _mailService = service;
    _to = configuration["emailAddress.Support"];
}

在本例中,该行

services.AddSingleton(provider => Configuration);

相当于

services.AddSingleton<IConfigurationRoot>(provider => Configuration);

因为类上的配置属性是这样声明的,并且注入(inject)将通过匹配它注册的任何类型来完成。我们可以很容易地复制这个,这可能会让它更清楚:

试试这个,看看是否有帮助。

关于c# - 间歇性依赖注入(inject)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55839514/

相关文章:

azure - 从 Azure Active Directory 获取订阅的 TenanId

angular - 如何使用参数实例化 Angular 组件?

Symfony 4 - 服务被移除或内联,尽管它是公开的

c# - 可排序、可拖动、可排序表 + mvc 未正确更新顺序

C# WPF Clipboard.SetText() 无法正常工作

c# - 计算枚举掩码 c#

c# - RegisterOpenGeneric with SimpleInjector 解析不正确的类型

c# - Ngen vs RyuJIT - 在(预)启动无关紧要时最快的 x64 运行代码

asp.net-mvc-3 - 如何在 Windows Azure 上使用 SquishIt

Azure Data Lake 存储和数据工厂 - 临时 GUID 文件夹和文件