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

时间:2018-06-01 09:33:28

标签: c# asp.net-mvc asp.net-mvc-4 signalr signalr-hub

我尝试将收到的数据从webservice调用发送到我的javascript客户端。 什么是正确的方法?我应该在Controller类中创建hubContext

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

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

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

1 个答案:

答案 0 :(得分:0)

你永远不应该实例化一个与当前执行上下文分离的Controller,其中一个小例外是作为单元测试的一部分进行模拟。

构造如:

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

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

但是你的例子不完整,因为你没有在getData(_Ids)方法中显示什么,你说你从网络服务中获取数据?

也许您可以在Hub本身内的receiveData()中封装检索逻辑,即getData(_Ids),或者如果您在更多地方调用此服务,您还可以定义一个静态适配器帮助程序类,它将包围调用到Web服务,此适配器以后可以在集线器的receiveData()方法中使用。

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