CQRS - Che cos'è il Command Dispatcher?

1

Per imparare CQRS sto mettendo insieme una semplice implementazione di comando / comando. In molti esempi, vedo il concetto di "Command Dispatcher". Non sto vedendo molta letteratura su questo.

Mi chiedo che cos'è un Command Dispatcher e perché è necessario? Il Command Dispatcher e il Command Bus sono la stessa cosa?

    
posta anthonator 31.12.2017 - 23:20
fonte

2 risposte

6

Il Command Dispatcher non fa specificamente parte di CQRS; è solo un dettaglio di implementazione del Command Pattern e uno opzionale in questo.

Un Command Dispatcher è un oggetto che collega la richiesta di azione con il gestore di azioni appropriato. Lo scopo è quello di disaccoppiare l'operazione di comando dagli oggetti di invio e ricezione in modo che nessuno dei due abbia conoscenza dell'altro.

Un oggetto RoutedCommand in WPF è un buon esempio di Command Dispatcher.

CQRS è un concetto, non un progetto o un'implementazione. Dice "Separa le responsabilità di comando da quelle di query". Martin Fowler ripercorre questo concetto in dettaglio nel suo articolo CQRS; non menziona mai un commando comandante.

Ulteriori letture
P di EAA: CQRS
Comando Separazione query su Wikipedia
Command Dispatcher

    
risposta data 01.01.2018 - 00:27
fonte
0

Ti darò una risposta dalla mia esperienza.

Seguendo l'approccio DDD nei miei progetti Event sourcing , ho riscontrato un sacco di codice simile a questo, per il lato di comando dell'architettura:

  • identifica la classe Aggregate's per Command
  • carica Aggregate di id da Repository ( Event store )
  • chiama un metodo di comando su Aggregate , il cui nome assomiglia quasi al nome del comando
  • raccoglie il% co_de generato
  • continua gli eventi a Domain events
  • notifica agli iscritti il nuovo Repository

Il corso logico dell'azione è stato quello di estrarre questo algoritmo in un componente la cui responsabilità è quella di inviare / inviare un comando a un Domain events . L'interfaccia per questo è così ( Aggregate code):

interface CommandDispatcher
{
    public function dispatchCommand(Command $command, $metadata = null);
}

Naturalmente, al fine di non infrangere (troppo) il Principio di responsabilità singola , l'implementazione predefinita di questa PHP userebbe altri componenti per adempiere al suo lavoro (cioè un CommandDispatcher , un CommandSubscriber e un EventDispatcher ).

In base a questo modello, sono riuscito a estrarre un framework che inoltra il comando dal AggregateRepository (cioè Presentation layer endpoint) direttamente al REST HTTP , riducendo al minimo il numero di piastra della caldaia codice in ogni progetto di campo verde.

Combinando il pattern Decorator , sono anche riuscito a implementare altri problemi trasversali come l'autorizzazione e la registrazione dei comandi, senza inquinare il dominio principale con questo tipo di codice.

La mia versione open source Aggregate di PHP può essere trovata qui .

    
risposta data 01.01.2018 - 18:15
fonte

Leggi altre domande sui tag