我正在编写一个blazor服务器web应用程序。
我写了一个非常基本的signalr中心:
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方法.
我尝试过很多事情:
什么都不管用..。
我的问题是:如何从my_function对象调用AnotherClass?
非常感谢
发布于 2021-07-30 20:37:04
如何从my_function对象调用AnotherClass?
不能。集线器只在响应客户端调用时才被调用。无法手动调用集线器方法。
如果需要在集线器内部和集线器外部运行逻辑,则需要重构代码,以便集线器和AnotherClass可以访问某些共享类。
发布于 2021-07-30 20:45:03
我就是这么做的。
为集线器创建一个接口:
public interface IMyHub
{
Task MyFunction(int parameter);
}然后您的集线器实现了如下接口:
public class MyHub : Hub<IMyHub>
{
public async Task MyFunction(int parameter)
{
// do stuff
}
}然后将集线器注入其他类,如下所示:
private readonly IHubContext<MyHub, IMyHub> _myHub;您可以通过以下方式调用您的函数:
_myhub.Clients.All.MyFunction(someInt);添加到IMyHUb接口中的函数不必在MyHub类中有实现代码。例如,用
public interface IMyHub
{
Task MyFunction(int parameter);
Task MySecondFunction();
}在您的另一个类中,可以调用
_myhub.Clients.All.MySecondFunction();在MyHub类中没有任何新代码。
https://stackoverflow.com/questions/68596247
复制相似问题