Прерывистая ошибка внедрения зависимости - PullRequest
0 голосов
/ 25 апреля 2019

Я вижу следующее прерывистое исключение локально при попытке разрешить службу в приложении-функции Azure .net core 2.1. Кажется, что это происходит только тогда, когда функция обрабатывает несколько сообщений одновременно, и некоторые сообщения не выполняются.

'System.Private.CoreLib: исключение при выполнении функции: FunctionOne. Microsoft.Extensions.DependencyInjection: невозможно разрешить службу для типа «Microsoft.Extensions.Configuration.IConfiguration» при попытке активировать «XXX.Service2».

Когда служба находится в том же проекте, что и функция, все работает нормально. Это происходит только тогда, когда я перемещаю его в другой проект. Другой проект, который я создал, - это простой проект стандарта .net 2.0, в котором есть только этот сервис и ссылка на nuget Microsoft.Extensions.Configuration.

Я знаю, что эта реализация использует локатор служб, который является анти-шаблоном, но я все еще хочу понять, почему возникает это исключение.

[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 ]

1 голос
/ 25 апреля 2019

Похоже, что это «функция», представленная в версии 2.0.12408.0 среды выполнения. С 2.0.12382.0 этого не происходит.

1 голос
/ 25 апреля 2019

Попробуйте ввести его как IConfigurationRoot вместо IConfiguration:

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

В этом случае строка

services.AddSingleton(provider => Configuration);

эквивалентно

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

потому что свойство Configuration класса объявлено как таковое, и внедрение будет выполнено путем сопоставления с тем типом, в котором он был зарегистрирован. Мы можем воспроизвести это довольно легко, что может прояснить ситуацию:

попробуйте это и посмотрите, поможет ли это.

...