从我的应用程序的其他部分访问信号器中心
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方法...
我尝试了很多东西:
- 将 _hub 投射到 MyHub
- 声明 IMyHub 接口并在依赖注入中使用 IMyHub
- 等等
没有任何效果...
我的问题是:如何从 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。
我正在编写 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方法...
我尝试了很多东西:
- 将 _hub 投射到 MyHub
- 声明 IMyHub 接口并在依赖注入中使用 IMyHub
- 等等
没有任何效果...
我的问题是:如何从 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。