迁移至Wolverine:如何在单例HostedService中集成使用?
在Wolverine中实现单例Hosted Service处理消息的方案
方案1:将Hosted Service直接作为单例消息处理器
Wolverine支持将已注册的单例服务作为消息处理器,你可以让Hosted Service实现IMessageHandler<T>接口,同时保持其单例生命周期:
// 你的单例Hosted Service,同时实现消息处理器接口 public class MySingletonHostedService : BackgroundService, IMessageHandler<YourNotificationMessage> { // 处理消息的逻辑 public Task HandleAsync(YourNotificationMessage message, CancellationToken cancellationToken) { // 在这里处理收到的消息 return Task.CompletedTask; } // Hosted Service原有后台逻辑 protected override async Task ExecuteAsync(CancellationToken stoppingToken) { // 你的后台服务逻辑,比如保持服务运行 await Task.Delay(Timeout.Infinite, stoppingToken); } }
然后在注册时指定为单例Hosted Service,Wolverine会自动识别它作为对应消息的处理器:
// Program.cs中配置 builder.Services.AddHostedService<MySingletonHostedService>(); builder.Host.UseWolverine(opts => { // 可选:显式指定该处理器为单例(如果自动识别有问题时用) opts.Handlers.For<YourNotificationMessage>().UseHandler<MySingletonHostedService>(); });
方案2:在单例Hosted Service中主动订阅消息
如果不想让Hosted Service实现处理器接口,你可以注入IMessageBus,在服务内部主动订阅消息流,和MediatR.Courier的使用逻辑类似:
public class MySingletonHostedService : BackgroundService { private readonly IMessageBus _messageBus; public MySingletonHostedService(IMessageBus messageBus) { _messageBus = messageBus; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { // 主动订阅指定类型的消息,在单例服务内部处理 await _messageBus.ListenFor<YourNotificationMessage>(async message => { // 处理消息的逻辑 }).Until(stoppingToken); // 其他后台服务逻辑 } }
核心说明
- Wolverine的
IMessageHandler<T>默认是瞬态,但通过上述两种方式,完全可以实现单例Hosted Service处理消息的需求,不需要额外的类似Courier的扩展。 - 第一种方案更贴合Wolverine的原生处理器模式,第二种方案更灵活,适合需要在Hosted Service内部控制订阅逻辑的场景。
内容的提问来源于stack exchange,提问作者Luka
相关产品推荐
相关产品推荐

