2 votes

Envoyer des messages via SignalR HubContext à partir d'une méthode dans un projet extérieur où se trouvent les Hubs

J'ai un projet WebAPI dans lequel les couches API, Service et Données sont toutes dans des projets séparés de la même solution. Dans le cadre d'une méthode de mon projet Service, je veux envoyer un message aux clients connectés d'un hub du projet API. Jusqu'à présent, tous les exemples que j'ai trouvés ont tout placé dans un seul projet et utilisent un contrôleur comme exemple pour envoyer un message via un hub.

J'ai essayé l'injection de dépendances (Autofac) mais je ne parviens pas à obtenir une référence au MessageHub.

enter image description here

[HubName("messages")]
public class MessageHub : Hub
{
    public void ShowNewMessage(string message)
    {
        Clients.All.showMessageOnPage(message);
    }
}

Ma tentative d'injection peut être vue ici : Injecter SignalR IHubContext dans la couche service avec Autofac

1voto

Alexander I. Points 1008

Veuillez revoir cette option :

  1. Définissez une interface de hub générique dans votre projet de couche de service (ou mieux de domaine). Quelque chose comme IMessageBroker .
  2. À l'intérieur de votre projet de couche de présentation (WebAPI), implémentez cette interface et utilisez IConnectionManager pour la récupération du HubContext.
  3. Enregistrer l'interface dans un conteneur IoC (Autofac) dans la couche de présentation.
  4. Injecter l'interface dans l'App Service

Pseudo Code :

Couche du domaine :

public interface IMessageBroker
{
    void ShowNewMessage(string message)
}

Couche de service :

public class NotificationService: INotificationService
{
    private readonly IMessageBroker _messageBroker;

    public NotificationService(IMessageBroker messageBroker)
    {
        _messageBroker = messageBroker;
    }

    public void RunNotification(string message)
    {
        _messageBroker.ShowNewMessage(message);
    }
}

Couche de présentation :

[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
    }
}

Enregistrement Autofac (couche de présentation) :

// 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>();

Un sujet similaire à SO est également disponible ici .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X