【发布时间】:2019-12-03 19:36:29
【问题描述】:
我查看了几个网页上的许多示例,最后由于每个示例的方法不同而感到非常困惑。我只想使用一个 HubBase 类,在其中定义共享集线器方法,即 OnConnected()、AddToGroup()) 和多个集线器类(HubX、HubY),在其中我为这些集线器定义特定方法。这是我尝试应用的基本结构:
ITypedHubClient:
public interface ITypedHubClient
{
Task BroadcastData(string groupName, object data);
}
HubBase:
public class HubBase : Hub<ITypedHubClient>
{
public readonly static ConnectionMapping<string> connections =
new ConnectionMapping<string>();
public override async Task OnConnected()
{
//
}
public override async Task OnDisconnected(bool stopCalled)
{
//
}
public async Task AddToGroup(string connectionId, string groupName)
{
//
}
public async Task SendMessageToAll(string user, string message)
{
await Clients.All.SendAsync(user, message);
}
public async Task SendMessageToGroup(string groupName, string message)
{
await Clients.Group(groupName).SendAsync(message);
}
}
HubX:
[HubName("hubX")]
public class HubX : HubBase
{
private readonly static IHubContext context =
GlobalHost.ConnectionManager.GetHubContext<HubX>();
public static async Task SendDataToGroup(string groupName, object data)
{
await context.Clients.Group(groupName).refreshData(data);
}
public static async Task BroadcastData(object data)
{
await context.Clients.Group("groupX").refreshData(data);
}
}
控制器:
public class MyController : Controller
private IHubContext<HubX> hubContext;
public MyController(IHubContext<HubX> hubContext)
{
this.hubContext = hubContext;
}
public JsonResult Create()
{
//...
this.hubContext.Clients.Group("groupX").BroadcastData("groupX", data);
}
我的问题是:
1) 为了正确使用 DI 和使用 Hub 基类,应该进行哪些更改?
2) 我应该从 Controller 调用集线器方法吗?还是 Hub 类(HubX、Y)?我的意思是,在某些示例中,hubContext.Clients.All.SendMessageToAll(message) 方法直接从 Controller 调用,而在其中一些示例中调用 Hub 类中的方法,即HubX.SendMessageToAll(message);。知道哪个是最佳实践吗?
3)我应该从 Hub 或 HubBase 类继承 Hub 吗?
注意:如果您只知道上述问题之一,我也可以,我们将不胜感激。
【问题讨论】:
-
哪个示例显示
HubX.SendMessageToAll(message)?我从来没有见过。听起来像一个静态方法。
标签: c# asp.net-mvc signalr ninject signalr-hub