注册同一IHostedService

时间:2019-05-23 13:33:57

标签: c# asp.net-core

我正在尝试在asp.net核心中注册IHostedService的多个实例。我需要它来订阅多个队列并处理其中的消息。 这是我实现的用于注册队列订户实例的扩展方法:

        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。

尽管注册了多个实例,但出现运行时错误,提示“尝试激活BackgroundQueueSubscriber时无法解析QueueInfo类型的服务”。 为什么要尝试创建一个实例,而无视我提供的实现代码,如上所示?

我在做什么错了?

更新

我解决了这个问题。问题是,我使用Scrutor nuget在DI中将程序集中的每个类都注册为已实现的接口,因此它选择BackgroundQueueSubscriber作为IHostedService的实现。结果,它试图实例化它,并引发了异常。解决方案是在Scrutor中添加过滤器,以免自动注册此类。

0 个答案:

没有答案