在 MVC 中使用 SignalR 集线器和控制器类的正确方法 ASP.NET



我尝试将接收到的数据从Web服务调用发送到我的javascript客户端。 正确的方法是什么?我应该在控制器类中创建集线器上下文吗

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

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

//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( 封装在集线器本身的 receiveData(( 中,或者如果您在更多地方调用此服务,您还可以定义一个静态适配器帮助程序类,该类将环绕对 Web 服务的调用,并且该适配器稍后可以在集线器的 receiveData(( 方法中使用。

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

最新更新