Buduję aplikację z modelem domeny przy użyciu koncepcji CQRS i zdarzeń domen (ale bez gromadzenia zdarzeń, po prostu stary SQL). Nie było problemu z wydarzeniami typu SomethingChanged. Potem utknąłem w implementacji zdarzeń SomethingCreated.Nowy identyfikator jednostki w zdarzeniu domeny
Po utworzeniu elementu, który jest odwzorowany na tabelę z kluczem podstawowym tożsamości, nie znam identyfikatora, dopóki obiekt nie zostanie utrwalony. Podmiot jest wytrwałością nieświadomą, więc podczas publikowania zdarzenia z wnętrza jednostki, Id jest po prostu nieznany - jest magicznie ustawiony po wywołaniu context.SaveChanges(). Więc jak/gdzie/kiedy mogę umieścić identyfikator w danych zdarzenia?
Myślałam o:
- włącznie z odniesieniem do jednostki w imprezie. To działałoby wewnątrz domeny, ale niekoniecznie w rozproszonym środowisku z wieloma autonomicznymi systemami komunikującymi się przez zdarzenia/komunikaty.
- Zastępowanie SaveChanges() w celu uaktualnienia wydarzeń zapisanych do publikacji. Ale wydarzenia mają być niezmienne, więc wydaje się to bardzo brudne.
- Pozbycie się pól tożsamości i użycie identyfikatorów GUID wygenerowanych w konstruktorze jednostki. To może być najłatwiejsze, ale może wpłynąć na wydajność i utrudnić inne rzeczy, takie jak debugowanie lub kwerendy (
where id = 'B85E62C3-DC56-40C0-852A-49F759AC68FB'
, noMIN
,MAX
itp.). To właśnie widzę w wielu przykładowych aplikacjach. - Podejście hybrydowe - pozostaw tożsamość i używaj jej głównie dla kluczy obcych i szybszych połączeń, ale użyj identyfikatora GUID jako unikalnego identyfikatora, za pomocą którego pobierasz elementy z repozytorium w aplikacji.
Nie dołączaj odniesienia do encji w wydarzeniu. Dobrze jest umieścić identyfikator po zapisaniu. Należy je uznać za niezmienne po opublikowaniu. Jednak może to być kłopotliwe, jeśli zamierzasz zezwolić na ponowne próby w kontekście tworzenia zdarzenia.Wartość przypisywania identyfikatorów z zewnątrz jest tak duża, że uważam, że powinna to być domyślna strategia. Więc zarówno przy użyciu identyfikatorów GUID, jak i podejścia hybrydowego może działać. Innym podejściem może być mechanizm HILO lub coś w rodzaju płatka śniegu. –
Czy mógłbyś rozwinąć HILO i płatek śniegu? – Pein
http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx i http://engineering.twitter.com/2010/06/announcing-snowflake.html –