Sto cercando di risolvere una dipendenza circolare tra due componenti nel mio sistema. Il componente Messenger
è responsabile per l'invio e la ricezione di messaggi su un socket Web. Il componente Controller
richiede l'utilizzo del componente Messenger
per poter inviare messaggi ai client connessi perché il componente Messenger
è a conoscenza delle sessioni connesse.
Il componente Messenger
ha una dipendenza dal componente Controller
per poter notificare al controller i messaggi in arrivo.
Il WebsocketHandler
è un'interfaccia framework su cui non ho alcun controllo e in questo caso chiama i metodi appropriati sulla mia implementazione in base ai client connessi.
Quali modifiche architettoniche posso apportare per risolvere questo problema?
interface WebsocketHandler
{
void onConnect(Session session);
void onDisconnect(Session session);
void recieve(Object payload);
}
class Messenger implements WebsocketHandler
{
Controller controller;
Set<WebsocketSession> websocketSessions;
@Override
void onConnect(Session session)
{
sessions.add(session);
}
@Override
void onDisconnect(Session session)
{
sessions.remove(session);
}
@Override
void recieve(Object payload)
{
controller.messageReceived(payload);
}
// requires access to sessions to send messages
void send(Object payload)
{
for (WebsocketSession session : websocketSessions)
{
session.send(payload);
}
}
}
class Controller
{
Messenger messenger;
void messageReceived(Object payload)
{
// do something with payload
}
void notifyClients()
{
messenger.send(...);
}
}