从我的应用程序的其他部分访问信号器中心

Access to signalr hub from other part of my application

我正在编写 Blazor 服务器 Web 应用程序。

我写了这个非常基本的信号中心:

using Microsoft.AspNetCore.SignalR;

public class MyHub: Hub
{
   public override Task OnConnectedAsync()
   {
      ...
      return base.OnConnectedAsync();
   }

   public Task my_function()
   {
      ...
   }
   ....
}

这一步没问题。

现在,我想从我的 blazor 应用程序的另一部分访问这个中心:

public class AnotherClass
{
   private readonly IHubContext<MyHub> _hub;

   public AnotherClass(IHubContext<MyHub> hub)
   {
      _hub = hub;
   }

   ...
   
   public void another_function()
   {
      _hub.Clients.All.SendAsync(...); // <- This line works fine
      (_hub as MyHub).my_function();   // <- Does not work
   }
}

如您所见,我正在使用依赖注入来访问我的集线器对象。 我看了很多文档,包括微软的官方文档。 每个人都说我们必须在这种依赖注入中使用 IHubContext 类型。

所以_hub对象不知道my_function方法...

我尝试了很多东西:

没有任何效果...

我的问题是:如何从 AnotherClass 对象调用 my_function?

非常感谢

How can i call my_function from AnotherClass object ?

你不能。 Hub 仅在响应客户端调用时被调用。无法手动调用集线器方法。

如果您希望在集线器内部和集线器外部 运行 逻辑,您将需要重构您的代码,以便集线器和 AnotherClass 可以访问一些共享的 class .

这是我的做法。

为您的集线器创建接口:

public interface IMyHub
{
    Task MyFunction(int parameter);
}

然后您的集线器会像这样实现接口:

public class MyHub : Hub<IMyHub>
{
    public async Task MyFunction(int parameter)
    {
        // do stuff
    }
}

然后像这样将 hub 注入其他 classes:

private readonly IHubContext<MyHub, IMyHub> _myHub;

您可以通过以下方式调用您的函数:

_myhub.Clients.All.MyFunction(someInt);

这基于 Strongly Typed Hubs and Send Messages From Outside a Hub 文档。

您添加到 IMyHUb 接口的功能不一定要在 MyHub class 中有实现代码。例如,

public interface IMyHub
{
    Task MyFunction(int parameter);
    Task MySecondFunction();
}

在你的另一个 class 中你可以调用

_myhub.Clients.All.MySecondFunction();

MyHub 中没有任何新代码class。