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

ASP.NET Core SignalR:如何在OnConnectedAsync中注入服务?

问题描述

我已经通过以下方式创建了单例服务:

builder.Services.AddSingleton<ISessionManagerService, SessionManagerService>();

并且可以在Hub的自定义方法中通过参数注入该服务,示例如下:

public async Task Send(string action, object args, ISessionManagerService sessionManager)
{
    await Clients.All.Receive(action, args);
}

但当我重写OnConnectedAsync方法时,无法添加ISessionManagerService作为参数。我尝试了OnConnectedAsync(ISessionManagerService sessionManager)和OnConnectedAsync([FromServices] ISessionManagerService sessionManager)两种方式,均报错“no suitable method found to override”。请问在OnConnectedAsync方法中访问该服务的正确方式是什么?

解决方法

因为OnConnectedAsync是Hub基类定义的无参数方法,你不能通过修改参数列表来重写它。要在这个方法里访问服务,有两种常用方式:

  • 构造函数注入(推荐):
    在Hub类的构造函数中注入ISessionManagerService,将其保存为私有字段,之后在OnConnectedAsync里直接使用这个字段即可。示例代码:

    public class YourHub : Hub
    {
        private readonly ISessionManagerService _sessionManager;
    
        // 构造函数注入服务
        public YourHub(ISessionManagerService sessionManager)
        {
            _sessionManager = sessionManager;
        }
    
        public override async Task OnConnectedAsync()
        {
            // 直接使用注入的服务实例
            // _sessionManager.YourMethod();
            await base.OnConnectedAsync();
        }
    
        // 你的自定义方法
        public async Task Send(string action, object args, ISessionManagerService sessionManager)
        {
            await Clients.All.Receive(action, args);
        }
    }
    
  • 通过Context.RequestServices获取:
    如果不想使用构造函数注入,可以在OnConnectedAsync方法内通过Context.RequestServices获取服务实例。示例代码:

    public override async Task OnConnectedAsync()
    {
        var sessionManager = Context.RequestServices.GetService<ISessionManagerService>();
        if (sessionManager != null)
        {
            // 使用服务实例执行操作
            // sessionManager.YourMethod();
        }
        await base.OnConnectedAsync();
    }
    

构造函数注入更符合依赖注入的设计原则,同时也更便于进行单元测试,是优先推荐的方案。

内容的提问来源于stack exchange,提问作者Rgamer43

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:51:14