在SignalR中传递强类型集线器

本文关键字:强类型 集线器 SignalR | 更新日期: 2023-09-27 18:19:34

我刚刚更新了一些SignalR引用,为了允许通用类型的Hubs Hub<T>,情况发生了一些变化。在现有的示例和文档中,如:

带有Signalr 的服务器广播

我们有一个静态类,通过以下机制保存对客户端的引用:

public class StockTicker()
{
private readonly static Lazy<StockTicker> _instance = new Lazy<StockTicker>(
            () => new StockTicker(GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients));
 IHubConnectionContext Clients {get;set;}
 private StockTicker(IHubConnectionContext clients)
        {
            Clients = clients;
        }
}

因此,会检查静态引用,如果为空,则会到达:

GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients

创建一个实例并通过构造函数提供客户端。

所以这就是它过去的工作方式,事实上也是上面url的工作方式。但现在有了Hub<T>,构造函数中需要进行一个细微的更改:

 private StockTicker(IHubConnectionContext<dynamic> clients)
 {
   Clients = clients;
 }

现在我的问题是,我如何进一步扩展它,使我的StockTicker版本可以为x类型的客户端具有强类型属性。

 IHubConnectionContext<StockTickerHub> Clients {get;set;}
 private StockTicker(IHubConnectionContext<dynamic> clients)
 {
   Clients = clients; // Fails, wont compile
 }

通过维护强类型引用,我将能够调用强类型方法等。

在SignalR中传递强类型集线器

现在有一个新的GetHubContext重载,它接受两个泛型参数。第一个是像以前一样的Hub类型,但第二个泛型参数是TClient(它是Hub<T>中的T)。

假设StockTickerHub的定义如下:

public class TypedDemoHub : Hub<IClient>

然后

GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients

成为

GlobalHost.ConnectionManager.GetHubContext<StockTickerHub, IClient>().Clients

新重载返回给GetHubContext的类型将是IHubContext<IClient>,Clients属性将是IHubConnectionContext<IClient>,而不是IHubConnectionContext<dynamic>IHubConnectionContext<StockTickerHub>

.NET核心Web应用程序中,您可以注入类似的强类型signalR集线器上下文

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" };
    }
}

或者看看:

https://github.com/Gandalis/SignalR.Client.TypedHubProxy

它具有比上述TypeSafeClient更多的功能。

看看:

https://github.com/i-e-b/SignalR-TypeSafeClient

可能有用!