2011-01-08 14 views
6

Quando si implementano eventi di dominio, i gestori di eventi possono essere utilizzati solo per problemi puramente di dominio; qualcosa che dovresti discutere con gli esperti di business o sono aperti per essere utilizzati da tutto ciò che è interessato al modello di dominio?Gestori di eventi di dominio: devono essere utilizzati per i problemi relativi al livello di applicazione?

Questo probabilmente viene spiegato meglio con un semplice esempio, si consideri un'applicazione di calendario per la pianificazione del lavoro per i dipendenti.

Potremmo avere i seguenti eventi dominio ...

AppointmentAdded AppointmentRemoved AppointmentContentChanged AppointmentMoved

Abbiamo i gestori di questi eventi, per esempio quando un appuntamento viene spostato in un tempo al di fuori dei dipendenti orario di lavoro impostiamo una bandiera di avviso.

Ci sono di applicazione riguarda ovviamente interessate a questi eventi, ad esempio quando un appuntamento viene aggiunto al calendario, dovremmo aggiungerlo all'unità di lavoro in modo da poter commettere le modifiche in seguito.

Questi problemi di applicazione dovrebbero essere considerati consumatori degli eventi di dominio o dovrebbero invece essere generati e gestire eventi di sistema separati?

risposta

5

Ci sono 2 modi consolidati di utilizzare gli eventi in una soluzione DDD.

Il primo è basato su Udi Dahan articles about events. Se non li hai già letti, lo consiglio vivamente. In breve, si dice che si pubblicano i propri eventi utilizzando la classe statica oltre al normale stile ORM dello. Quindi aggiungi un ordine alla raccolta ordini del cliente e pubblichi l'evento. Poiché il comportamento del dominio viene eseguito all'interno di un ambito di transazione, lo stesso vale per i gestori di eventi. Potresti anche trovarti lì e consigliare di non attaccare manualmente oggetti a un'unità di lavoro. Nuove radici aggregate dovrebbero essere create richiamando il comportamento su quelle esistenti.

c'è un'altra opzione che è promosso da Greg Young. Si basa sul sourcing di eventi che fondamentalmente sta usando gli eventi come mezzo di stato persistente. In questo approccio le radici aggregate di solito utilizzano un'infrastruttura (ad esempio, la classe radice aggregata di base) per applicare gli eventi. Applica invoca un gestore eventi sulla classe radice aggregata e pubblica questo evento su un bus (indipendentemente dall'implementazione del bus che si utilizza).

+3

Dubito che promuovano la gestione degli eventi nella stessa transazione dell'aggregato che sta attivando quell'evento. Ricordo che Udi specifica che è meglio "licenziare e dimenticare" outsite la transazione aggregata, specialmente nei casi in cui i gestori di eventi non hanno nulla a che fare con il dominio (es .: messaggi di posta elettronica). "Accendi e dimentica" significa che non ti importa se l'ascoltatore ha ricevuto il messaggio, ma dovresti preoccuparti di quando lanciare un messaggio (invia il messaggio). Si invia un messaggio dopo che l'aggregazione ha terminato il suo lavoro: cambiamento di stato + persistenza. Quindi sono più che carino sparare un evento dopo la persistenza. – Tudor

+2

P.S. Un evento può essere attivato dall'aggregato in qualsiasi momento, ma la consegna effettiva del messaggio deve essere gestita dopo la persistenza aggregata (o dopo che è stato completato un comando specifico che ha attivato l'evento). – Tudor

2

Se si intendono i problemi trasversali di quanto si sarà costretti a utilizzare comunque se la logica dell'applicazione lo richiede. Quindi sarà mescolato con un altro codice di elaborazione degli eventi.

Ma se è necessario eseguire diverse operazioni indipendenti quando si verifica l'evento del dominio, è meglio utilizzare gestori di eventi separati (vedere Principio di separazione dei dubbi).

Nel primo caso, cercare di evitare di combinare la logica di dominio con la logica di elaborazione degli eventi (infrastruttura). L'infrastruttura sinistra/il codice di interesse trasversale nei gestori di eventi che chiamano i metodi di dominio. Sposta il codice di dominio all'interno dei metodi degli oggetti di dominio.

+0

sembra ragionevole, ma porta a una nuova domanda su quando aumentare gli eventi del dominio. Diciamo che l'aggiunta di un appuntamento al calendario viene eseguita in una transazione, aggiungendo l'entità a un UnitOfWork deve essere eseguita all'interno della transazione, ma l'aggiornamento dell'interfaccia utente deve essere eseguito al di fuori della transazione. In questo caso, l'evento del dominio dovrebbe essere sollevato all'interno della transazione?e l'aggiornamento dell'interfaccia utente dovrebbe essere fatto in un altro gestore di eventi di dominio che esegue il lavoro Async. – Andronicus

+1

L'evento di dominio rappresenta qualcosa che è già accaduto. Quindi non ci dovrebbe essere la possibilità di eseguire il rollback di una transazione all'interno del gestore di eventi. Effettua il commit della transazione quindi chiama i gestori di eventi per tutti gli eventi inviati durante la transazione. –

Problemi correlati