SignalR 在应用依赖注入时断开连接

SignalR getting disconnected while applying Dependency Injection

我是 SignalR 的新手,使用 .NET 5 和 angular13 建立实时聊天。建立连接时出现此错误——连接因错误而关闭。 NullReferenceException

经过多次debagging,我找到了问题的根本原因。当我向消息中心注入任何依赖项时。发生 NullReferenceException 错误。没有依赖性,连接已正确建立。

这是我的 MessageHub.cs 代码(有依赖)

public class MessageHub : Hub
{
    private readonly IMessageRepository _messageRepository;
    private readonly IUserRepository _userRepository;

    public MessageHub(IMessageRepository messageRepository, IUserRepository userRepository)
    {
        _messageRepository = messageRepository;
        _userRepository = userRepository;
    }


    public override async Task OnConnectedAsync()
    {
        var httpContext = Context.GetHttpContext();

        var otherUser = httpContext.Request.Query["user"].ToString();

        var groupName = GetGroupName(Context.User.GetUsername(), otherUser);

        await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
    }

    public override async Task OnDisconnectedAsync(Exception exception)
    {
        await base.OnDisconnectedAsync(exception);
    }

}

Startup.cs(配置服务)

   services.AddSignalR(e=>
        {
            e.EnableDetailedErrors = true;               
        });

Startup.cs(配置)

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapHub<MessageHub>("hubs/message");
        });

我非常需要这种依赖来完成我的功能。我对此很满意。如果我删除 Dependency 它工作正常。我试图从各种来源找到一些解决方案,但对我没有用。如果有人帮助我。对此我将不胜感激。

经过一些研究,我应用了一个对我有用的解决方案。我们可以检索服务对象。所以在 startup.cs 下面我做了什么

Startup.cs(配置服务)

  //we can retrieve service object
  public static IServiceProvider serviceProvider;
  
  services.AddSignalR()
  services.AddScoped<IUserRepository, UserRepository>();
  services.AddScoped<IMessageRepository, MessageRepository>();

在我的 MessageHub.cs 中,我没有使用依赖注入,而是检索了所需的服务并在下面的文件中定义它

MessageHub.cs

public class MessageHub : Hub
{
    private readonly IMessageRepository _messageRepository;
    private readonly IUserRepository _userRepository;

    public MessageHub()
    {
        _messageRepository = (IMessageRepository)Startup.serviceProvider.GetRequiredService(typeof(IMessageRepository));
        _userRepository = (IUserRepository)Startup.serviceProvider.GetRequiredService(typeof(IUserRepository));
    }

    // other code....
}

它对我有用。现在我可以从 IRepository 和 SignalR 实现我的必要方法也正常工作。