你如何在SignalR 3中获得HubContext?

时间:2015-09-04 14:05:54

标签: signalr

在SignalR 2中你可以做这样的事情(取自我的博客):

var stockTickerHub = GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>();

这允许您从集线器外部获取SignalR集线器的引用(例如,从股票行情线程中获取)。

这在SignalR 3中似乎不可用。您如何在新的和即将发布的SignalR中实现等效功能?

3 个答案:

答案 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 
});