L'attività
Il software che sto scrivendo funziona sui seguenti tipi di oggetto:
- Agenti
- Chiamate
- CallQueues
Questi oggetti possono essere collegati insieme e ognuno di essi contiene alcune informazioni aggiuntive. Ad esempio, una chiamata contiene il numero del chiamante, un agente contiene il suo nome e così via.
Questo modello dovrebbe reagire agli eventi esterni consegnati attraverso una coda di messaggi. La maggior parte degli eventi è simile alla seguente:
- un agente è entrato in un CallQueue;
- un agente ha lasciato un CallQueue;
- una chiamata è stata aggiunta a un CallQueue;
- una chiamata ha lasciato un CallQueue;
- un agente ha risposto a una chiamata;
- un agente ha completato una chiamata;
- ecc.
E così via. Fondamentalmente, la maggior parte degli eventi innescano la creazione e la rimozione di collegamenti tra gli oggetti e contengono anche informazioni aggiuntive. Alcuni eventi innescano una logica di business aggiuntiva, che è al di fuori dello scopo di questa domanda.
Gli aggiornamenti di agenti, chiamate e CallQueues devono essere osservati dall'esterno per scenari come questi:
- distribuzione degli aggiornamenti dello stato dell'applicazione ai client attraverso i flussi di eventi (ad esempio tramite WebSockets);
- persistenti aggiornamenti a un database;
- ecc.
Un aggiornamento è un evento che viene generato quando i dati dell'oggetto sono cambiati o è stato creato o rimosso un collegamento a un altro oggetto.
La domanda
Quali sono le migliori pratiche per organizzare la logica aziendale? Opzioni che ho:
-
Crea un componente separato per la gestione di ogni tipo di oggetto, e. g.
AgentsRegistry
,CallsRegistry
eCallQueuesRegistry
. Quando, ad esempio, si verifica un evento agente-collegato alla coda di chiamata, acquisirlo inCallQueuesRegistry
, creare un collegamento e notificareAgentsRegistry
, in modo che entrambi eseguano la propria logica aziendale. Esponi i flussi di eventi di aggiornamento da ciascun componente al mondo esterno, in modo che i gestori di persistenza e WebSockets possano collegarsi a esso e reagire. -
Crea un singolo componente
ApplicationState
per la gestione di tutti i tipi di eventi. Elabora collegamenti aggiornamenti internamente. Prova a separare la logica di business in metodi privati. Esporre un singolo flusso di eventi di aggiornamento dal componente al mondo esterno. -
Un mix dei due precedenti: nascondi i componenti separati dietro un oggetto
ApplicationState
, che dovrebbe reagire agli eventi e fungere da conduttore per la logica di business specifica del tipo. -
Metti la logica aziendale in Agenti, Chiamate e CallQueues - Non riesco a immaginare questo tipo di approccio quando entra in gioco la Dependency Injection e devono essere utilizzati componenti aggiuntivi. Inoltre, non è chiaro per me quale oggetto debba reagire a un evento di tipo agent-has-answer-a-call: l'agente o il call.
Quale opzione è preffered e perché? Quali altre opzioni esistono?
EDIT: dividi la domanda in due , ribattezzato Queues to CallQueues.
EDIT 2: Chiarificazione: un CallQueue
è generalmente un elenco di chiamate in attesa di essere elaborate da un Agent
che è vincolato a quel particolare CallQueue
. È una rappresentazione virtuale di un queue
reale in un'applicazione esterna e non ha nulla a che fare con una struttura di dati queue
, perché la logica FIFO è gestita in quell'app esterna. La mia app riceve solo notifiche su una determinata chiamata che entra nella coda, lasciandola (cosa che può accadere in modo casuale) o raggiungendo un Agent
libero e connettendosi con essa. Più CallQueues
esiste.
Non esiste una coda di Agents
in attesa di Call
, almeno nell'ambito di questa app. Per quanto ci riguarda, una Agent
pseudo-casuale si connette a un% pseudo-casuale% di% della Call
.