Passing strongly typed Hubs in SignalR
There is now a new overload of GetHubContext that takes two generic parameters. The first is the Hub type like before, but the second generic parameter is TClient (which is the T in Hub<T>
).
Assuming that StockTickerHub is defined as follows:
public class TypedDemoHub : Hub<IClient>
Then
GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients
becomes
GlobalHost.ConnectionManager.GetHubContext<StockTickerHub, IClient>().Clients
The type returned by the new overload to GetHubContext would be IHubContext<IClient>
and the Clients property would be IHubConnectionContext<IClient>
instead of IHubConnectionContext<dynamic>
or IHubConnectionContext<StockTickerHub>
.
In .NET Core Web App you can inject strongly typed signalR hub context like this
public interface IClient{ Task ReceiveMessage(string message);}public class DevicesHub : Hub<IClient>{}public class HomeController : ControllerBase{ private readonly IHubContext<DevicesHub, IClient> _devicesHub; public HomeController(IHubContext<DevicesHub, IClient> devicesHub) { _devicesHub = devicesHub; } [HttpGet] public IEnumerable<string> Get() { _devicesHub.Clients .All .ReceiveMessage("Message from devices."); return new string[] { "value1", "value2" }; }}
Or take look at:
https://github.com/Gandalis/SignalR.Client.TypedHubProxy
It comes with more features than the TypeSafeClient mentioned above.