Con il sourcing di eventi, è possibile proiettare un evento per creare modelli di lettura ottimizzati per le query. Questo capisco. Quello di cui non sono sicuro è se questi modelli di lettura possono dipendere l'uno dall'altro?
Sto considerando di pre-generare pagine HTML e report PDF in una certa parte di un'applicazione. Le pagine HTML non sono interattive, ma piuttosto informazioni, proprio come i report PDF. Tuttavia, per generare i report, i dati devono essere ottenuti da un'altra proiezione. Vale a dire, una proiezione SQL. Quindi l'architettura dell'applicazione dovrebbe essere la seguente:
+-----------+
|Event Store| +------------+
+--^-----+--+ |SQL Database+-------+
| | +------^-----+ |
| | | |
| | | |
+---+-----v---+ +------------+ +----+----+ |
|Command Model+-------->Event Stream+----+---->Projector| |
+-------------+ +------------+ | +---------+ |
| |
| |
| +-------------+ |
+---->HTML Renderer<----+
| +-------------+ | +---------+
| +---------------->+HTML Page|
| | +---------+
| +------------+ |
+---->PDF Renderer<-----+
+------------+ +------------+
+---------------->+PDF Document|
+------------+
Il problema di cui sopra è che HTML Renderer
e PDF Renderer
dipendono da un'altra proiezione, il che significa che l'ordine in cui le proiezioni sono costruite diventa importante. È un problema significativo?
L'alternativa a quanto sopra è:
- Tratta il rendering HTML / PDF come una query, eseguita per richiesta.
- Fai in modo che i proiettori HTML e PDF utilizzino le proprie strutture di dati interne (ad esempio una tabella SQL simile al proiettore SQL), rimuovendo il problema di ordinamento.
- Tratta il rendering HTML / PDF come un livello separato "sopra" il livello della query. Ad esempio, una query dice "dammi gli oggetti che corrispondono ai criteri C e formattali usando il formattore F". La query recupera i dati dal database e viene utilizzato il renderer appropriato per produrre l'output.