间歇性依赖注入失败

时间:2019-04-24 22:41:07

标签: c# azure dependency-injection azure-functions

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

  

'System.Private.CoreLib:执行函数FunctionOne时发生异常。 Microsoft.Extensions.DependencyInjection:尝试激活“ XXX.Service2”时,无法解析类型为“ Microsoft.Extensions.Configuration.IConfiguration”的服务。

当服务与功能位于同一项目中时,则一切正常。只有当我将其移至另一个项目时,才会发生这种情况。我创建的另一个项目只是一个简单的.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
{
}

2 个答案:

答案 0 :(得分:1)

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

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

在这种情况下,行

services.AddSingleton(provider => Configuration);

等同于

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

因为类的Configuration属性是这样声明的,所以注入将通过匹配其注册为的任何类型来完成。我们可以很容易地复制它,这可能使它更清晰:

尝试一下,看看是否有帮助。

答案 1 :(得分:1)

它似乎是运行时版本2.0.12408.0引入的“功能”。 2.0.12382.0不会发生这种情况。