繁体   English   中英

在SignalR中传递强类型的集线器

[英]Passing strongly typed Hubs in SignalR

我刚刚更新了一些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;
        }
}

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

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

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

所以这就是它以前的工作方式,而且确实是上面的网址是如何工作的 但是现在使用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
 }

通过维护强类型引用,我可以调用强类型方法等。

现在有一个新的GetHubContext重载,它带有两个通用参数。 第一个是Hub类型,如前所述,但第二个通用参数是TClient(它是Hub<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>

或者看看:

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

它具有比上面提到的TypeSafeClient更多的功能。

.NET Core Web App中,您可以像这样注入强类型的signalR hub上下文

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/ieb/SignalR-TypeSafeClient

可能有用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM