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 .