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
相关产品推荐
相关产品推荐

