Я пытаюсь зарегистрировать несколько экземпляров моего 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, чтобы автоматически не регистрировать этот класс.