2015-09-04 63 views
3

在SignalR 2,你可以做這樣的事情(從我的博客取):如何在SignalR 3中獲得HubContext?

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

這讓你從輪轂外部(例如從股票行情線程)獲取到SignalR樞紐的參考。

這在SignalR 3中看起來似乎不可用。您如何在新的和即將推出的SignalR中實現同等功能?

回答

1

從我見過的每個示例以及我已經實現的少數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 
}); 
2

我問同樣的事情到SignalR,大衛·福勒的創造者上Jabbr,一個論壇,SignalR的創造者和ASP.NET 5建築師不時掛在的時候,他的回答這個問題是使用dependency injection

雖然我還沒有與SignalR 3嘗試過,我敢肯定你可以注入,在你的類實現IConnectionManagerConnectionManager一個實例,並使用它,就像你會使用GlobalHost解決您的樞紐環境。

再次,我沒有這樣做SignalR3,但我希望這會讓你更接近尋找解決方案。我使用Autofac在我的集線器中注入依賴關係,但也在其他類中注入ConnectionManager的實例以獲取集線器上下文)。

希望這會有所幫助。祝你好運!

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(); 
    } 
}