在here中,它指出
所有客户端将使用相同的URL与您的服务建立SignalR连接(“ / signalr”或您的自定义URL(如果已指定)),并且该连接将用于该服务定义的所有集线器。
与在单个类中定义所有集线器功能相比,多个集线器没有性能差异。
我之所以要这样做,是因为我唯一的集线器正成为上帝之类,但是,我找不到在.NET Core中共享多个连接的方法。我希望我可以这样做,然后可以像在Web API中一样管理代码。
一种可能的解决方案可能会创建多个连接,但是我必须在客户端管理不同的连接,只是为了防止服务器代码上出现类。
在here中,有人指出将方法映射到外部类是一种解决方法。那是唯一的解决方法吗?
答案 0 :(得分:1)
由于SignalR已集成在ASP.NET Core中,因此无法any more将一个连接用于多个集线器:
在ASP.NET Core SignalR中,连接模型已得到简化。直接与单个集线器建立连接,而不是使用单个连接共享对多个集线器的访问。
作为 god 类的解决方法,如果要使用单个集线器,则可以使用#region
来构造代码。
但是,我要做建议为每个目的使用不同的集线器。例如:如果我有一个聊天系统,我将使用一个特定的中心(ChatHub
)进行聊天。如果我也有测验系统,我会使用QuizHub
,依此类推...
我真的看不到处理多个连接的问题。因为不会有性能问题。通过为每种目的分离代码,您正在实现关注点分离(如果我输入错了,请纠正我)。
如果可以的话,只需将SignalR客户端代码(每个集线器)划分为自己的文件,即可在实际使用它的页面上初始化客户端代码(连接)。
让我举最后一个例子:如果测验有自己的页面,则仅在该页面上加载SignalR客户端代码。
您可以尝试的另一件事是AJAX请求。有时,我将代码分成不同的API控制器,然后简单地向我的API控制器发出AJAX请求,以处理数据库事务。
您还可以通过使用IHubContext<T>
在该控制器内部使用一些 SignalR功能。
在ASP.NET Core SignalR中,您可以通过依赖注入来访问IHubContext的实例。您可以将IHubContext实例注入到控制器,中间件或其他DI服务中。使用实例将消息发送给客户端。
class SomeController : Controller
{
private readonly IHubContext<MyHub> _hubContext;
public SomeController(IHubContext<MyHub> hubContext)
{
_hubContext = hubContext;
}
}
using SignalR functions outside the hub的文档中有更多示例。
缺点是您无法使用SignalR的所有出色功能,例如将连接添加到组。可以在控制器内使用。
答案 1 :(得分:0)
如何使用局部类。不确定这种方法是否有缺点。
public partial class TestHub : Hub
{
}
public partial class TestHub {
}