You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:12:12