c# - 注册同一个 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 添加一个过滤器,以不自动注册此类。
解决方案
推荐阅读
- algorithm - 给定一个对象向量,查找范围最快的速度是多少?
- dart - 如何为大量 CheckboxListTiles 创建一个布尔值?
- python - 在 Python Web 驱动程序中检索 HTML 元素对象
- c++ - 图中的 MST 相关边
- api - JWT 令牌似乎是正确的,但收到的响应是 401
- python - 熊猫列中不同组的不同缩放比例
- java - 如何修复“com.mysql.cj.jdbc.exceptions.CommunicationsException”错误
- nativescript - 如何在本地 chrome 和本地模拟器中调试 nativescript
- java - 在向布局添加按钮时获取 java.lang.reflect.InvocationTargetException
- machine-learning - 在 Keras 中使用“ImageDataGenerator”并在训练我的模型时直接传递它时,是否修改了图像以增加数据集?