SignalR中的多个集线器(设计)

时间:2012-05-29 05:17:09

标签: signalr

使用SignalR,我想知道设置我的集线器的最佳方式是在以下场景下:假设我有一个网络赌场应用程序(只是为了好玩),它有三个游戏,扑克,二十一点和老虎机。扑克和二十一点都是多人游戏,因此他们有聊天功能而插槽没有。好的,为了支持这一点,我正在考虑以下列方式设置我的集线器。

BaseHub(处理扑克,二十一点和老虎机常见的连接内容)

PokerHub:BaseHub(处理扑克游戏)

BlackjackHub:BaseHub(处理二十一点游戏)

SlotsHub:BaseHub(处理老虎机游戏)

ChatHub(处理聊天功能)

我想这个网络应用程序的扑克页面连接到PokerHub以及ChatHub和Blackjack页面会做类似的事情。 Slots页面显然只能连接到SlotsHub。

现在,我不确定的事情是:Poker / Blackjack页面是否应该连接到PokerHub / BlackjackHub和ChatHub,或者是否有某种方式可以让他们只连接到PokerHub / BlackjackHub并委派聊天功能到聊天中心?在那种情况下,我可能会创建一个接口IHasChat或类似的东西。在任何一种情况下,ChatHub都应该扩展BaseHub吗?目前,BaseHub仅实现IConnected,IDisconnect以及处理基本的Group功能(JoinGroup,LeaveGroup)。另外,BaseHub应该是一个共享实例(单例)吗?

最后,如果你认为我只是完全错了,请告诉我。这是我的第一个SignalR项目,我知道我不是它的专家。另外,我知道这里有几个问题。如果你能回答其中的任何一个或全部,无论哪种方式,我都非常感激。

谢谢你, 汤姆

3 个答案:

答案 0 :(得分:5)

您可以拥有任意数量的集线器,因为只有一个连接到SignalR服务器。集线器是RPC实现,并且都共享相同的连接。 The Wiki page on hubs for the js client显示如下连接:

$.connection.hub.start()

其中hub是js客户端内的命名空间。

答案 1 :(得分:1)

实际上,它永远不需要在服务器上拥有多个集线器类。它就像你需要多个互联网连接。一个用于冲浪游戏,另一个用于社交媒体,第三个用于不同的东西。

在服务器端创建一个Hub类。

你应该做的是让不同的客户使用JS。

例如在我的网站上我有两件事。实时聊天和离线通知。对于chat.aspx,我有一个名为“chat”的变量充当Hub。对于所有其他页面,我有一个名为NotificationHub的变量。

您可以执行以下操作

var pocker = $.connection.hub;
var blackJack = $.connection.hub;
var other = $.connection.hub;

这种方式调用相应的方法 此外,如果您要识别谁调用了您的服务器方法,您可以附加查询字符串参数。

pocker.connection.qs = "type=pocker";

答案 2 :(得分:0)

这已经有一段时间了,所以你可能不再需要答案,但......这里什么也没有。

我是SignalR的新手,所以我不确定您的设计会如何影响其性能。如果这不是问题,我可能会考虑这样的对象模型:

abstract BaseHub : Hub;
abstract MultiplayerHub : BaseHub; // (Handles chat and other MP necessities)
BlackJackHub : MultiplayerHub;
PokerHub : MultiplayerHub;
SlotsHub : BaseHub;

我无法想到为什么这种设计会导致SignalR出现任何问题,但同样,我也没有太多的经验可以继续。