Регистрация нескольких экземпляров одного и того же IHostedService - PullRequest
2 голосов
/ 23 мая 2019

Я пытаюсь зарегистрировать несколько экземпляров моего IHostedService в ядре asp.net. Мне нужно, чтобы подписаться на несколько очередей и обрабатывать сообщения в них. Вот метод расширения, который я реализовал, чтобы зарегистрировать экземпляр моего подписчика в очереди:

        public static IServiceCollection AddQueueSubscription<T>(this IServiceCollection services, string accountName, string queueName,
        Func<IServiceProvider,Func<T, Task>> actionResolver)
    {
        services.AddSingleton<IHostedService>(ctx =>
        {
            return new BackgroundQueueSubscriber(new QueueInfo
                {
                    Account = accountName,
                    Name = queueName,
                    Action = msg => actionResolver(ctx)(JsonConvert.DeserializeObject<T>(msg.AsString))
                },
                ctx.GetRequiredService<IConfiguration>(),
                ctx.GetRequiredService<IMetrics>());
        });
        return services;
    }

BackgroundQueueSubscriber реализует IHostedService.

Несмотря на регистрацию нескольких экземпляров, я получаю сообщение об ошибке во время выполнения, которое говорит: «Не удается разрешить службу для типа QueueInfo при попытке активировать BackgroundQueueSubscriber». Почему он пытается создать экземпляр, не учитывая предоставленный мною код реализации, показанный выше?

Что я делаю не так?

UPDATE

Я решил проблему. Проблема заключалась в том, что я использовал Scrutor nuget для регистрации в DI каждого класса в моей сборке как реализованного интерфейса, поэтому он выбрал BackgroundQueueSubscriber в качестве реализации IHostedService. В результате он попытался создать его экземпляр и вызвал исключение. Решением было добавить фильтр в Scrutor, чтобы автоматически не регистрировать этот класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...