DomainEvent base
Domain event’ler Domain.SharedKernel.SeedWork.DomainEvent’ten türer. Her event Guid v7 (time-ordered) Id ve UTC CreatedAt taşır:
INotification’dır (MediatR ile dispatch için) ve değişmez veri taşıyan POCO’lardır — örn. UserOtpGeneratedDomainEvent, FaqCreatedDomainEvent, UserRoleAssignedDomainEvent.
Aggregate’ta event yayını
Event aggregate içindenAddDomainEvent(...) ile biriktirilir; dış dünyaya değil, change-tracker’a yazılır. SaveEntitiesAsync sonrası dispatch edilir:
Dispatch — MediatorExtension
SaveEntitiesAsync, base.SaveChangesAsync’ten sonra (result > 0 ise) DispatchDomainEventsAsync’i çağırır. Yani event’ler DB commit’ten sonra in-memory yayınlanır:
DispatchDomainEventsAsync change-tracker’daki tüm Entity’lerin event’lerini toplar, ClearDomainEvents() ile temizler ve tek tek dispatch eder. IBusEvent (yani integration event) olanları IEventBus’a, kalanları mediator.Publish ile in-process handler’lara yönlendirir (bkz. Event Akışı). Hata olursa log’lanır ama akış kesilmez.
INotificationHandler örnekleri
Domain event’i tüketen handler INotificationHandler<TEvent>’i implement eder. Bir event’in birden çok handler’ı olabilir — MediatR hepsini çağırır.
Yan etki: SMS / e-posta
UserOtpGeneratedDomainEvent (ve UserOtpResentDomainEvent) hem SMS hem e-posta handler’ı tarafından dinlenir; her biri OTP tipine göre kendi kanalını seçer:
SendOtpEmailDomainEventHandler aynı event’i dinler ama type != OtpType.Email ise atlar — iki handler, tek event, ayrılan sorumluluk.
Bu OTP event’leri bilinçle in-process tutulur (cross-service notification ihtiyacı doğarsa ayrı bir integration event eklenir). Karar handler doc’larında açıkça not edilmiştir.
Domain event’ten integration event yayma
Bazı domain event handler’ları, in-process işin yanında bir integration event yayınlar.UserCreatedDomainEventHandler:
Cache invalidation
Domain event handler cache tag’i düşürmek için de kullanılır —InvalidateFaqCacheDomainEventHandler IHybridRequestCache.RemoveByTagAsync(CacheTags.Faqs) çağırır. Ayrıntı: Cache Invalidation.
İlgili
Integration Events
Cross-service event’ler ve consumer kaydı.
Event Akışı
Domain vs integration, tam dispatch akışı.
Cache Invalidation
Event handler’da tag düşürme.
OTP
OTP üretimi ve gönderim akışı.