在SignalR 2中你可以做这样的事情(取自我的博客):
var stockTickerHub = GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>();
这允许您从集线器外部获取SignalR集线器的引用(例如,从股票行情线程中获取)。
这在SignalR 3中似乎不可用。您如何在新的和即将发布的SignalR中实现等效功能?
答案 0 :(得分:2)
我向SignalR
的创建者,Jabbr上的David Fowler提出了同样的问题,这是一个由SignalR的创建者和ASP.NET 5
的建筑师不时挂起的论坛,他对这个问题的回答是使用dependency injection
。
虽然我还没有使用SignalR 3
尝试过,但我很确定你可以在你的课程中注入ConnectionManager
实现IConnectionManager
的实例,并且只使用它就像你使用GlobalHost
来解决你的枢纽环境一样。
同样,我没有使用SignalR3
完成此操作,但我希望这会让您更接近找到解决方案。
我整理了sample for using SignalR 2
with Autofac. (In this repo我使用Autofac
在我的集线器中注入依赖项,但也在其他类中注入ConnectionManager
的实例以获取集线器上下文。
希望这会有所帮助。祝你好运!
答案 1 :(得分:2)
依赖注入确实是方法和工作。
示例:
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();
}
}
答案 2 :(得分:1)
从我见过的每个例子和我实施的少数SignalR 3应用程序中,您不再拥有对您的集线器的强类型引用。当前的方法通过集线器的名称和URL连接到集线器。 On generic方法创建对该集线器的广播订阅以及您提供的方法名称。
HubConnection connection = new HubConnection(ServerURL);
IHubProxy hubProxy = connection.CreateHubProxy("StockTickerHub");
hubProxy.On<StockTickerMessage>("[Your method name here]", msg => {
//your UI update logic here
});