DomainEvent + INotification
Her eventDomainEvent tabanından türer (Version 7 GUID kimliği + UTC zaman damgası alır) ve MediatR’ın INotification arayüzünü uygular:
Event payload’u değişmezdir (yalnız
get property’ler). Tüketici verisini değiştiremez; sadece okur. Olay, gerçekleşmiş bir durumun fotoğrafıdır.AddDomainEvent ile aggregate’ta yayma
Aggregate, durumunu değiştirdiği davranış metodunun sonunda olayı kuyruğa ekler. Olay hemen işlenmez — yalnızca kayıt persist edildikten sonra dispatch edilmek üzere biriktirilir.AddDomainEvent EntityBase üzerinde tanımlıdır ve olayı entity’nin iç DomainEvents listesine ekler.
Dispatch: SaveEntitiesAsync sonrası MediatR
Olaylar, yazma işlemi başarıyla tamamlandıktan sonra yayınlanır. AkışIUnitOfWork.SaveEntitiesAsync içinde gerçekleşir:
SaveChanges çağrısından sonra change tracker’daki tüm entity’lerin DomainEvents listesi toplanır, MediatR Publish ile yayınlanır ve ardından ClearDomainEvents() ile temizlenir.
Gerçek event listesi
DiyanetCleanArchitecture.Domain/Events/ klasöründeki olaylardan bir kesit:
User olayları
User olayları
UserCreatedDomainEvent, UserOtpGeneratedDomainEvent, UserOtpResentDomainEvent,
UserPhoneNumberVerifiedDomainEvent, UserEmailVerifiedDomainEvent,
UserRoleAssignedDomainEvent, UserRoleRevokedDomainEvent,
UserTokensInvalidatedDomainEvent, UserTotpEnabledDomainEvent.Citizen olayları
Citizen olayları
CitizenCreatedDomainEvent, CitizenOtpGeneratedDomainEvent, CitizenOtpResentDomainEvent,
CitizenPhoneNumberVerifiedDomainEvent, CitizenEmailVerifiedDomainEvent,
CitizenAccountDeactivatedDomainEvent, CitizenTokensInvalidatedDomainEvent,
CitizenRefreshTokenRevokedDomainEvent.Faq olayları
Faq olayları
FaqCreatedDomainEvent, FaqUpdatedDomainEvent, FaqDeletedDomainEvent, FaqReorderedDomainEvent.BagisBasvuru olayları (Türkçe isimli)
BagisBasvuru olayları (Türkçe isimli)
BagisBasvuruOlusturulduDomainEvent, BagisBasvuruIncelemeyeAlindiDomainEvent,
BagisBasvuruBelgeBeklendiDomainEvent, BagisBasvuruOnaylandiDomainEvent,
BagisBasvuruReddedildiDomainEvent, BagisBasvuruIptalEdildiDomainEvent,
BagisBasvuruOdemesiTamamlandiDomainEvent.EtkinlikBasvuru ve SupportTicket olayları
EtkinlikBasvuru ve SupportTicket olayları
EtkinlikBasvuruOlusturulduDomainEvent, EtkinlikBasvuruOnaylandiDomainEvent,
EtkinlikBasvuruPlanKontenjanDolduDomainEvent, … ;
SupportTicketCreatedDomainEvent, SupportTicketAssignedDomainEvent,
SupportTicketStatusChangedDomainEvent, SupportTicketCommentAddedDomainEvent.İsimlendirme tutarlıdır: domain dilinde Türkçe kavramlar (Bağış, Etkinlik başvurusu) Türkçe event isimleri taşır —
...OlusturulduDomainEvent, ...OnaylandiDomainEvent, ...ReddedildiDomainEvent. Teknik/altyapı olayları (User, Faq) İngilizce kalır.Handler örnekleri
Bir domain event’i birden fazla handler dinleyebilir; her biri tek bir yan etkiden sorumludur.SMS / E-posta gönderimi
SendOtpEmailDomainEventHandler üstlenir (type == OtpType.Email ise).
Cache invalidation
Domain event → integration event köprüsü
Bazı handler’lar olayı integration event’e çevirip mesaj kuyruğuna basar (sistemler arası iletişim):Domain event vs integration event
| Domain Event | Integration Event | |
|---|---|---|
| Kapsam | Aynı süreç içi (in-process) | Süreç/servis dışı |
| Taşıyıcı | MediatR INotification | IEventBus → MassTransit + RabbitMQ Outbox |
| Ne zaman | SaveEntitiesAsync sonrası | Bir domain event handler’ı tarafından yayınlanır |
| Payload | Zengin domain tipleri (VO’lar) | Primitive/serileştirilebilir alanlar |
| Örnek | UserCreatedDomainEvent | UserCreatedIntegrationEvent |
Sonraki adımlar
Aggregate'ler
AddDomainEvent’in davranış metotlarında kullanımı.Event-Driven Akış
Dispatch, MassTransit Outbox ve RabbitMQ tüketici zinciri.
Veri Katmanı
SaveEntitiesAsync ve DispatchDomainEventsAsync detayları.Yeni domain event ekleme
Adım adım playbook.