Envie mensagens via SignalR HubContext do método no projeto fora de onde os Hubs estão localizados
Eu tenho um projeto WebAPI em que as camadas de API, Serviço e Dados estão todas em projetos separados da mesma solução. Como parte de um método em meu projeto de serviço, desejo enviar uma mensagem aos clientes conectados de um hub no projeto de API. Até agora, todos os exemplos que encontrei têm tudo em um único projeto e usam um controlador como exemplo de envio de mensagem por meio de um hub.
Eu tentei injeção de dependência (Autofac), mas não consigo obter uma referência para o MessageHub.

[HubName("messages")]
public class MessageHub : Hub
{
public void ShowNewMessage(string message)
{
Clients.All.showMessageOnPage(message);
}
}
Minha tentativa de injeção pode ser vista aqui: Injetar SignalR IHubContext na camada de serviço com Autofac
Respostas
Reveja esta opção:
- Defina a interface de hub genérica em seu projeto de camada de serviço (ou melhor domínio). Algo parecido
IMessageBroker
. - Dentro de seu projeto de camada de apresentação (WebAPI), implemente esta interface e use
IConnectionManager
para recuperação de HubContext. - Registre a interface em um Container IoC (Autofac) na Camada de Apresentação
- Injetar a interface dentro do App Service
Pseudo-código:
Camada de domínio:
public interface IMessageBroker
{
void ShowNewMessage(string message)
}
Camada de serviço:
public class NotificationService: INotificationService
{
private readonly IMessageBroker _messageBroker;
public NotificationService(IMessageBroker messageBroker)
{
_messageBroker = messageBroker;
}
public void RunNotification(string message)
{
_messageBroker.ShowNewMessage(message);
}
}
Camada de apresentação:
[HubName("messages")]
public class MessageHub: Hub
{
public void ShowNewMessage(string message)
{
Clients.All.showMessageOnPage(message);
}
}
public class MessageBroker: IMessageBroker
{
private readonly IConnectionManager _connectionManager;
public MessageBroker(IConnectionManager connectionManager)
{
_connectionManager = connectionManager;
}
public void ShowNewMessage(string message)
{
var hub = _connectionManager.GetHubContext<MessageHub>();
// Use Hub Context and send message
}
}
Registro Autofac (Camada de Apresentação):
// Register Hubs
builder.RegisterHubs(Assembly.GetExecutingAssembly());
// Register Autofac resolver into container to be set into HubConfiguration later
builder.RegisterType<AutofacDependencyResolver>().As<IDependencyResolver>().SingleInstance();
// Register ConnectionManager as IConnectionManager so that you can get hub context via IConnectionManager injected to your service
builder.RegisterType<ConnectionManager>().As<IConnectionManager>().SingleInstance();
// Register interface
builder.RegisterType<MessageBroker>().As<IMessageBroker>();
Também um tópico semelhante de SO está disponível aqui .