Skip to main content

DomainEvent base

Domain event’ler Domain.SharedKernel.SeedWork.DomainEvent’ten türer. Her event Guid v7 (time-ordered) Id ve UTC CreatedAt taşır:
Somut event’ler 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çinden AddDomainEvent(...) 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ışı.