Sto costruendo un'applicazione con un modello di dominio utilizzando CQRS e concetti di eventi di dominio (ma nessun evento di approvvigionamento, solo semplice vecchio SQL). Non c'è stato nessun problema con gli eventi di tipo SomethingChanged. Poi sono rimasto bloccato nell'implementare eventi SomethingCreated.Nuovo ID entità nell'evento di dominio
Quando creo una qualche entità, che è associata a una tabella con chiave primaria identità poi non si conosce l'ID fino a che viene mantenuto l'entità. L'entità è ignoranza della persistenza, quindi quando pubblichi un evento dall'interno dell'entità, Id non è noto - è magicamente impostato solo dopo aver chiamato context.SaveChanges(). Quindi come/dove/quando posso inserire l'ID nei dati dell'evento?
pensavo:
- Compreso il riferimento all'entità nell'evento. Ciò funzionerebbe all'interno del dominio ma non necessariamente in un ambiente distribuito con più sistemi autonomi che comunicano per eventi/messaggi.
- Sovrascrivere SaveChanges() per aggiornare in qualche modo gli eventi accodati per la pubblicazione. Ma gli eventi devono essere immutabili, quindi questo sembra molto sporco.
- Eliminazione dei campi identità e utilizzo dei GUID generati nel costruttore entità. Questo potrebbe essere il più semplice, ma potrebbe colpire le prestazioni e rendere più difficili altre cose, come il debug o l'interrogazione (
where id = 'B85E62C3-DC56-40C0-852A-49F759AC68FB'
, n.MIN
,MAX
ecc.). Questo è quello che vedo in molte applicazioni di esempio. - Approccio ibrido: non utilizzare l'identità e utilizzarla principalmente per chiavi esterne e join più veloci, ma utilizzare GUID come identificativo univoco mediante il quale estrarre le entità dal repository nell'applicazione.
Non includere un riferimento all'entità nell'evento. Va bene attaccare l'id dopo il salvataggio. Dovrebbe essere considerato immutabile dopo la pubblicazione. Tuttavia questo potrebbe finire per essere problematico se hai intenzione di consentire tentativi nel contesto di produzione dell'evento.C'è un valore nell'assegnazione degli ID dall'esterno, così tanto che penso che questa dovrebbe essere una strategia predefinita. Quindi, utilizzare entrambi i GUID e l'approccio ibrido potrebbe funzionare. Un altro approccio potrebbe essere un meccanismo HILO o qualcosa come il fiocco di neve. –
Potresti elaborare su HILO e fiocco di neve? – Pein
http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx e http://engineering.twitter.com/2010/06/announcing-snowflake.html –