Bildirimler ve Olaylar
MediatR ile alan olaylarını yayımlayın.
Bildirimler ve Olaylar, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
İstekler ve Bildirimler
Bir isteğin bir handler'ı vardır ve bir değer döndürür. Bildirim ise bir yayındır: sıfır veya daha fazla handler'ı vardır ve hiçbir şey döndürmez. Bir şeyin gerçekleştiğini duyurmak için bildirimleri kullanın.
// Request: one handler, returns a result
// Notification: many handlers, fire-and-forgetINotification Arayüzü
Bir alan olayı, INotification uygulayan bir kayıttır. Geçmişte gerçekleşmiş bir olguyu anlatır.
public record OrderPlacedNotification(int OrderId, int CustomerId)
: INotification;INotificationHandler
Her abone INotificationHandler<TNotification> uygular. Birçok handler aynı bildirime abone olabilir ve her biri bildirimi bağımsız olarak ele alır.
public class SendConfirmationEmailHandler
: INotificationHandler<OrderPlacedNotification>
{
public Task Handle(
OrderPlacedNotification n, CancellationToken ct)
{
// send the email...
return Task.CompletedTask;
}
}Birden Çok Abone
İhtiyacınız olduğu kadar handler ekleyin. Hiçbiri diğerlerinden haberdar değildir; publisher'a dokunmadan yeni tepkiler eklenebilir.
public class UpdateInventoryHandler
: INotificationHandler<OrderPlacedNotification>
{
public Task Handle(OrderPlacedNotification n, CancellationToken ct)
{
// decrement stock...
return Task.CompletedTask;
}
}Yayımlama
Bir bildirimi tetiklemek için IPublisher (veya IMediator) ekleyin ve Publish çağırın. Kayıtlı her handler çağrılır.
public class CreateOrderHandler(AppDbContext db, IPublisher publisher)
: IRequestHandler<CreateOrderCommand, int>
{
public async Task<int> Handle(CreateOrderCommand c, CancellationToken ct)
{
var order = new Order { CustomerId = c.CustomerId };
db.Orders.Add(order);
await db.SaveChangesAsync(ct);
await publisher.Publish(
new OrderPlacedNotification(order.Id, c.CustomerId), ct);
return order.Id;
}
}Yan Etkileri Ayırma
Bildirimler ana kullanım senaryosunun odağını korur. Sipariş vermek yalnızca siparişi kaydeder ve bir olay yayımlar; e-posta gönderimi ile stok işlemleri kendi handler'larında bulunur. Bu, açık/kapalı ilkesinin uygulamadaki hâlidir.
// CreateOrderHandler does NOT know about email or inventoryYayımlama Stratejisi
Varsayılan olarak MediatR her bildirim handler'ını sırayla bekler. Handler'lardan biri hata fırlatırsa sonraki handler'lar çalışmaz. Bunları paralel olarak çalıştırmak için özel bir publisher sağlayabilirsiniz.
builder.Services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly);
cfg.NotificationPublisher = new TaskWhenAllPublisher();
});Hataları Ele Alma
Handler'lar bağımsız olduğundan, bir hatanın ne anlama geldiğine karar verin. Kritik olmayan yan etkiler için hatayı yakalayıp handler içinde günlüğe kaydedin; böylece tek bir hata diğerlerini bozmaz.
public async Task Handle(OrderPlacedNotification n, CancellationToken ct)
{
try { await _email.SendAsync(n.CustomerId, ct); }
catch (Exception ex) { _logger.LogError(ex, "email failed"); }
}Etki Alanı Olayları Deseni
Yaygın bir desen şöyledir: varlıklar etki alanı olaylarını toplar ve işlem kaydedildikten sonra bunların tümünü yayımlarsınız. Böylece olayların yalnızca değişiklik kesinleştirildiğinde tetiklenmesi garanti edilir.
await db.SaveChangesAsync(ct);
foreach (var domainEvent in order.Events)
await publisher.Publish(domainEvent, ct);
order.Events.Clear();Bildirimler ve İleti Kuyrukları Karşılaştırması
MediatR bildirimleri işlem içidir ve istek içinde eşzamanlı çalışır. Hizmetler arası veya kalıcı teslimat için bunun yerine gerçek bir ileti aracısına (ör. RabbitMQ, Azure Service Bus) yayımlayın.
// In-process reactions -> MediatR notifications
// Cross-service / durable -> message brokerBildirimleri Sınama
Bir handler'ın doğru olayı yayımladığını, sahte bir IPublisher geçirip çağrıldığını doğrulayarak sınayabilirsiniz.
var publisher = new Mock<IPublisher>();
var handler = new CreateOrderHandler(db, publisher.Object);
await handler.Handle(new CreateOrderCommand(1, []), default);
publisher.Verify(p => p.Publish(
It.IsAny<OrderPlacedNotification>(), default), Times.Once);Hızlı Kontrol
Bildirim modelini doğrulayın.
Özet
Bildirimleri ve olayları öğrendiniz:
INotification, sıfır veya daha fazlaINotificationHandleriçeren bir yayındır.- Tüm aboneleri çağırmak için
IPublisher.Publishile yayımlayın. - Bildirimler yan etkileri birbirinden ayırır ve açık/kapalı ilkesini izler.
- Bildirimler işlem içidir; hizmetler arası veya kalıcı olaylar için bir ileti aracısı kullanın.
Böylece CQRS ve MediatR kursu tamamlanmış olur.
Yapay zeka eğitmeniyle C# öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 93
- Dersler
- 346
Sıkça Sorulan Sorular
“Bildirimler ve Olaylar” dersi ücretsiz mi?
Evet — “Bildirimler ve Olaylar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Bildirimler ve Olaylar” dersinde ne öğreneceğim?
MediatR ile alan olaylarını yayımlayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Bildirimler ve Olaylar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- CQRS Kavramları
- MediatR ile Komutlar ve İşleyiciler
- İşlem Hattı Davranışları
- Bildirimler ve Olaylar