在 ASP.NET MVC 中使用 SignalR Hub 和 Controller class 的正确方法

correct approach with SignalR Hub and Controller class in ASP.NET MVC

我尝试将从网络服务调用接收到的数据发送到我的 javascript 客户端。 什么是正确的做法?我应该在控制器中创建一个 hubContext class

//Controller 
var data = this.getData(_Ids);
var hubContext = GlobalHost.ConnectionManager.GetHubContext<Hubs.MyHub>();
hubContext.Clients.Client(cc.ConnectionId).receiveData(data);

并以这种方式发送接收到的数据。 或者我应该在 Hub class 中创建一个控制器来获取数据并将其发送到 Hub

//SignalR Hub
var data = new MyController().getData(_Ids);
Clients.Client(cpm.ConnectionId).receiveData(data);

你不应该实例化一个从当前执行上下文分离的控制器,小异常被模拟作为单元测试的一部分。

构造如下:

var data = new MyController().getData(_Ids);

最好避免。如果从两者中做出决定,最好从控制器中获取集线器上下文。

然而,您的示例不完整,因为您没有显示 getData(_Ids) 方法内部的内容,您说您从 Web 服务获取数据?

也许您可以封装检索逻辑,即 getData(_Ids) in receiveData() 在集线器本身内,或者如果您在更多地方调用此服务,您还可以定义一个静态适配器助手 class这将环绕对 Web 服务的调用,此适配器稍后可以在集线器的 receiveData() 方法中使用。

请注意,根据您编写的应用程序、其范围和功能,使用某些依赖注入框架(如 Autofac 或 Ninject 并通过构造函数而不是将 IConnectionManager 注入控制器可能是个好主意在方法中实例化它。