多个集线器连接到一个连接以防止神职

时间:2018-12-20 09:54:14

标签: c# asp.net asp.net-core asp.net-core-signalr

here中,它指出

  

所有客户端将使用相同的URL与您的服务建立SignalR连接(“ / signalr”或您的自定义URL(如果已指定)),并且该连接将用于该服务定义的所有集线器。

     

与在单个类中定义所有集线器功能相比,多个集线器没有性能差异。

我之所以要这样做,是因为我唯一的集线器正成为上帝之类,但是,我找不到在.NET Core中共享多个连接的方法。我希望我可以这样做,然后可以像在Web API中一样管理代码。

一种可能的解决方案可能会创建多个连接,但是我必须在客户端管理不同的连接,只是为了防止服务器代码上出现类。

here中,有人指出将方法映射到外部类是一种解决方法。那是唯一的解决方法吗?

2 个答案:

答案 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 {

    }