Veuillez revoir cette option :
- Définissez une interface de hub générique dans votre projet de couche de service (ou mieux de domaine). Quelque chose comme
IMessageBroker
.
- À 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.
- Enregistrer l'interface dans un conteneur IoC (Autofac) dans la couche de présentation.
- 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 .