Domanda

Nella nostra applicazione alziamo gli eventi di dominio quando qualcosa cambia nel modello di dominio. Alcuni dei compiti che vengono eseguite dai gestori di eventi deve essere fatto all'interno della stessa transazione che è stato utilizzato quando l'evento viene generato, altre operazioni devono essere eseguite al di fuori di questa transazione.

Ad esempio,

Quando si aggiunge un orderline a un'entità Ordine, l'evento dominio OrderLineAdded è sollevato, un evento dominio cambia lo stato del modello di dominio (così deve essere effettuato nella stessa transazione), poi, quando la transazione è completata il mosto UI essere aggiornati.

Come ci si avvicina a questo problema?

  1. sollevano due eventi, uno all'interno della transazione, e uno al di fuori della transazione.
  2. Sollevare la parte interna caso di transazione, ma utilizzare il gestore di eventi per inviare una richiesta asincrona per aggiornare l'interfaccia utente?

L'opzione 1 sembra confondere, in quanto gli eventi nomi deve in qualche modo trasmettere sono dentro o fuori di una transazione, ma con l'opzione 2 gestori della manifestazione dominio deve sempre supporre che essi sono chiamati in modo sincrono da all'interno di una transazione.

Forse c'è un approccio migliore?

È stato utile?

Soluzione

Ho avuto un problema simile. modello di dominio pubblicava eventi (con la tecnica Udi Dahan descrive qui ). Poi mi sono reso conto che i miei gestori UI-correlato sono invocate anche se qualcosa va storto e transazione viene annullata in seguito.

Per risolvere questo ho introdotto un altro ruolo per il sistema, un altro tipo di gestore di eventi. Mi ha ITransactionalEventHadneler e INonTransactionalEventHandler. I primi erano invocato synchonously immediatamente metodo DomainEvents.Publish(). Questi ultimi sono stati in coda ad essere invocate non appena transazione viene commesso (usando System.Transactions ganci). La soluzione ha funzionato bene ed era abbastanza leggibile e mantenibile.

Altri suggerimenti

Credo che sia l'approccio potrebbe essere buono, solo rispettare lo stesso approccio in ogni parte del vostro codice:

  1. avrete bisogno di due (o più) i gestori di eventi, uno per il contesto del modello di dominio che è dentro il campo di applicazione delle transazioni e altri (s) per i contesti ausiliari, come l'interfaccia utente. Il codice di dominio non dovrebbe preoccuparsi di quello che in altre parti del codice di fare, basta notifichino circa la variazione dei dati di dominio.
  2. il metodo di gestore di eventi codice di dominio può inviare eventi asincroni per l'interfaccia utente o di altri moduli. Gli eventi di dominio devono essere sincroni, altrimenti avreste bisogno di commit a due fasi per mantenere transactionality.

io personalmente come opzione 2 più, perché mantiene il codice dominio più pulito e utilizzando la comunicazione asincrona saranno disaccoppiati il ??nucleo e altri moduli, quindi problemi nei moduli esterni saranno non ostacola il funzionamento del nucleo. D'altra parte, vi possono essere casi in cui l'opzione 1 è più vantaggiosa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top