Невозможно связать реализацию службы с использованием внутренней функции DI с параметром ServiceBusTrigger в. net core Azure Web Job - PullRequest
1 голос
/ 15 марта 2020

У меня есть консольное приложение. net, которое я собираюсь развернуть как веб-задание Azure. Цель задания - прослушивать новые сообщения в Azure очереди служебной шины. Я настроил слушателя с помощью функции, содержащей атрибут [ServiceBusTrigger]. Я построил фиктивную реализацию, которая просто читает последнее сообщение из очереди - это работает без проблем - сообщение корректно передается из очереди служебной шины в мою функцию.

Когда я пытаюсь go перейти к следующему Уровень и добавить параметр интерфейса для функции, которая будет введена DI Я получаю ошибку.

Microsoft. Azure .WebJobs.Host.Indexers.FunctionIndexingException: 'Метод индексации ошибок' Functions.ProcessMeasurementData '' InvalidOperationException: Невозможно привязать параметр 'service' к типу IProcessMeasurementService. Убедитесь, что параметр Type поддерживается привязкой. Если вы используете расширения привязки (например, Azure Storage, ServiceBus, Timers и т. Д. c.), Убедитесь, что вы вызвали метод регистрации для расширения (ей) в своем коде запуска (например, builder.AddAzureStorage () , builder.AddServiceBus (), builder.AddTimers (), et c.).

Это моя функция. Если я удалю параметр IProcessMeasurementService service, он без проблем будет работать локально из Visual Studio 2019 (я еще не пробовал развертывать на azure в качестве веб-задания), подбирая новые элементы по мере их добавления на служебную шину Azure. Очередь.

public class Functions
{
    public static async Task ProcessMeasurementData(
        [ServiceBusTrigger("process-measurement-data-queue", Connection = "AzureWebJobsServiceBus")] Message message,
    IProcessMeasurementService service)
    {
        try
        {

            var measurements = JsonConvert
                .DeserializeObject<List<CreateMeasurementInput>>
                    (Encoding.UTF8.GetString(message.Body));

            await service.DoStuff(measurements);

            // log.LogInformation(message.ContentType);
        }
        catch (Exception e)
        {

            throw;
        }
    }

Мне кажется, я правильно регистрирую службу, например:

            {
                // Register application services
                services.AddSingleton<IProcessMeasurementService, ProcessMeasurementService>();
            });

Это моя основная функция в целом.

        static void Main(string[] args)
    {
        var builder = new HostBuilder();

        builder.ConfigureAppConfiguration((builder) =>
        {
            builder

                .AddJsonFile("appsettings.json", false, true)
                .AddEnvironmentVariables();
        });


        builder.ConfigureWebJobs(b =>
        {
            b.AddServiceBus(x =>
            {
                x.MessageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
                {
                    AutoComplete = false
                };
            });

            b.AddAzureStorageCoreServices();
        });

        builder.ConfigureServices(services =>
        {
            services.AddOptions();

            // Register application services
            services.AddSingleton<IProcessMeasurementService, ProcessMeasurementService>();
        });

        var host = builder.Build();

        using (host)
        {
            host.Run();
        }
    }

От поисков в Google кажется, что проблема может быть связана с моей версией пакета nuget. Я попытался добавить файл с именем "host. json" на случай, если это была известная проблема с версиями функций azure, конфликтующими с библиотеками расширений. Но это ничего не сделало. На самом деле я не использую AzureFunctions (я имею в виду функции без сервера), но на этом этапе я держусь за str aws.

Кто-нибудь знает, в чем проблема?

Это хост. json на всякий случай, если это проблема.

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[1.*, 2.0.0)"
  }
}

Вот мой нюгет установленные версии

<PackageReference Include="Microsoft.Azure.ServiceBus" Version="4.1.2" />
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.16" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="4.1.1" />
<PackageReference Include="Microsoft.Azure.WebJobs.Sources" Version="3.0.16" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.2.0" />

1 Ответ

2 голосов
/ 15 марта 2020

Перейдите от метода функции stati c к члену экземпляра и внедрите службу с помощью инжектора конструктора непосредственно в класс функции.

public class Functions {

    private readonly  IProcessMeasurementService service;

    public Functions (IProcessMeasurementService service) {
        this.service = service;
    }

    public async Task ProcessMeasurementData(
        [ServiceBusTrigger("process-measurement-data-queue", Connection = "AzureWebJobsServiceBus")] Message message) 
    {
        try {

            var measurements = JsonConvert
                .DeserializeObject<List<CreateMeasurementInput>>
                    (Encoding.UTF8.GetString(message.Body));

            await service.DoStuff(measurements);

            // log.LogInformation(message.ContentType);
        } catch (Exception e) {
            //...    
            throw;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...