【问题标题】:Multiple hubs to one connection to prevent god class多个集线器到一个连接以防止神级
【发布时间】:2018-12-20 09:54:14
【问题描述】:

来自here,它声明

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

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

我想这样做的原因仅仅是因为我唯一的 Hub 正在成为神级,但是,我找不到在 .NET Core 中创建多个 Hub 的方法(同时共享一个连接)。我希望我可以这样做,然后我可以像在 Web API 中那样管理我的代码。

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

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

【问题讨论】:

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


    【解决方案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 的所有出色功能,例如向组添加连接。可以在您的控制器中使用。

    【讨论】:

    • Because there will be no performance issues. 不完全同意。每个集线器都会打开自己的连接,因此 100 个用户将生成 200 个连接,而不是只有 100 个。如果使用某种会话,则必须获取 200 次而不是仅 100 次。当多个连接保持打开时,它还可能影响移动设备的电池。我同意关注点分离。但我认为旧方法在这里更好:您在集线器之间有一个干净的分离,而不必担心太多的连接。
    • 根据this post 的说法,Apple 系统似乎每个服务器限制为四个连接。这可以通过 SignalR Core 上的多个集线器轻松实现,但在单个连接的旧方法上没有问题。
    【解决方案2】:

    如何使用部分类。不确定这种方法是否有任何缺点。

        public partial class TestHub : Hub
        {
    
        }
    
        public  partial class TestHub {
    
        }
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2020-01-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 2019-01-31
      • 1970-01-01
      相关资源
      最近更新 更多