правильный подход с классом SignalR Hub и Controller в ASP.NET MVC - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь отправить полученные данные от вызова веб-сервиса своим клиентам javascript.Какой правильный подход?Должен ли я создать hubContext в классе Controller

//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 голосов
/ 03 июня 2018

Никогда не следует создавать экземпляр Controller, отсоединенный от текущего контекста выполнения, за исключением небольшого исключения, являющегося насмешливым в рамках модульного тестирования.

Конструкции типа:

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

Лучше всего избегать.Если выбрать из двух, лучше получить контекст концентратора из контроллера.

Ваш пример, однако, неполон, поскольку вы не показываете, что внутри метода getData (_Ids), вы говорите, что извлекаете данные из веб-службы?

Возможно, вы можете инкапсулировать логику поиска, т.е.getData (_Ids) в receiveData () внутри самого Хаба, или если вы вызываете эту службу в большем количестве мест, вы также можете определить класс вспомогательного статического адаптера, который будет обернуть вызовы веб-службы, и этот адаптер впоследствии можно будет использоватьв методе receiveData () концентратора.

Обратите внимание, что в зависимости от приложения, написанного вами, его объема и функциональности, было бы неплохо использовать некоторую платформу Dependency Injection, такую ​​как Autofac или Ninject, и просто внедрить IConnectionManager вКонтроллер через конструктор вместо того, чтобы создавать его в методах.

...