首页 > 解决方案 > 注册同一个 IHostedService 的多个实例

问题描述

我正在尝试在 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 添加一个过滤器,以不自动注册此类。

标签: c#asp.net-core

解决方案


推荐阅读