在SignalR 2,你可以做这样的事情(从我的博客取):如何在SignalR 3中获得HubContext?
var stockTickerHub = GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>();
这让你从轮毂外部(例如从股票行情线程)获取到SignalR枢纽的参考。
这在SignalR 3中看起来似乎不可用。您如何在新的和即将推出的SignalR中实现同等功能?
在SignalR 2,你可以做这样的事情(从我的博客取):如何在SignalR 3中获得HubContext?
var stockTickerHub = GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>();
这让你从轮毂外部(例如从股票行情线程)获取到SignalR枢纽的参考。
这在SignalR 3中看起来似乎不可用。您如何在新的和即将推出的SignalR中实现同等功能?
从我见过的每个示例以及我已经实现的少数SignalR 3应用程序中,您不再有对集线器的强类型引用。当前的方法通过集线器的名称和URL连接到集线器。 On泛型方法将创建一个订阅,以便从该集线器和您提供的方法名称进行广播。
HubConnection connection = new HubConnection(ServerURL);
IHubProxy hubProxy = connection.CreateHubProxy("StockTickerHub");
hubProxy.On<StockTickerMessage>("[Your method name here]", msg => {
//your UI update logic here
});
我问同样的事情到SignalR
,大卫·福勒的创造者上Jabbr,一个论坛,SignalR的创造者和ASP.NET 5
建筑师不时挂在的时候,他的回答这个问题是使用dependency injection
。
虽然我还没有与SignalR 3
尝试过,我敢肯定你可以注入,在你的类实现IConnectionManager
的ConnectionManager
一个实例,并使用它,就像你会使用GlobalHost
解决您的枢纽环境。
再次,我没有这样做SignalR3
,但我希望这会让你更接近寻找解决方案。我使用Autofac
在我的集线器中注入依赖关系,但也在其他类中注入ConnectionManager
的实例以获取集线器上下文)。
希望这会有所帮助。祝你好运!
依赖注入确实是这种方式和工作。
实施例:
public class ChatController : Controller
{
readonly IConnectionManager _connectionManager;
public ChatController(IConnectionManager connectionManager)
{
_connectionManager = connectionManager;
}
public IActionResult Chat(string message)
{
IHubContext context = _connectionManager.GetHubContext<ChatHub>();
IConnection connection = _connectionManager.GetConnectionContext<PersistentConnection>().Connection;
context.Clients.All.NewMessage(message);
return new EmptyResult();
}
}