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 .