0Pricing
C# Academy · Pelajaran

Notifikasi dan Peristiwa

Publikasikan peristiwa domain dengan MediatR.

Notifikasi dan Peristiwa adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Permintaan dibandingkan Notifikasi

Suatu permintaan memiliki satu handler dan mengembalikan nilai. Notifikasi adalah siaran: notifikasi memiliki nol atau lebih handler dan tidak mengembalikan apa pun. Gunakan notifikasi untuk mengumumkan bahwa sesuatu telah terjadi.

// Request:      one handler, returns a result
// Notification: many handlers, fire-and-forget

INotification

Peristiwa domain adalah catatan yang menerapkan INotification. Peristiwa tersebut menjelaskan fakta yang telah terjadi.

public record OrderPlacedNotification(int OrderId, int CustomerId)
    : INotification;

INotificationHandler

Setiap pelanggan mengimplementasikan INotificationHandler<TNotification>. Banyak handler dapat berlangganan notifikasi yang sama, dan masing-masing menanganinya secara mandiri.

public class SendConfirmationEmailHandler
    : INotificationHandler<OrderPlacedNotification>
{
    public Task Handle(
        OrderPlacedNotification n, CancellationToken ct)
    {
        // send the email...
        return Task.CompletedTask;
    }
}

Beberapa Pelanggan

Tambahkan handler sebanyak yang Anda perlukan. Tidak ada handler yang mengetahui handler lainnya—reaksi baru dapat ditambahkan tanpa menyentuh publisher.

public class UpdateInventoryHandler
    : INotificationHandler<OrderPlacedNotification>
{
    public Task Handle(OrderPlacedNotification n, CancellationToken ct)
    {
        // decrement stock...
        return Task.CompletedTask;
    }
}

Publikasi

Untuk memicu notifikasi, injeksikan IPublisher (atau IMediator), lalu panggil Publish. Setiap handler yang terdaftar akan dipanggil.

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;
    }
}

Memisahkan Efek Samping

Notifikasi menjaga agar kasus penggunaan utama tetap fokus. Menempatkan pesanan hanya mencatat pesanan dan memublikasikan peristiwa; pengiriman email dan pengelolaan persediaan berada di handler masing-masing. Inilah penerapan prinsip terbuka/tertutup.

// CreateOrderHandler does NOT know about email or inventory

Strategi Publikasi

Secara bawaan, MediatR menunggu setiap handler notifikasi secara berurutan. Jika salah satunya melempar pengecualian, handler berikutnya tidak akan dijalankan. Anda dapat menyediakan publisher khusus untuk menjalankannya secara paralel.

builder.Services.AddMediatR(cfg =>
{
    cfg.RegisterServicesFromAssembly(typeof(Program).Assembly);
    cfg.NotificationPublisher = new TaskWhenAllPublisher();
});

Menangani Kegagalan

Karena handler bersifat mandiri, tentukan makna sebuah kegagalan. Untuk efek samping yang tidak kritis, tangani dan catat kegagalan di dalam handler agar satu kegagalan tidak mengganggu handler lainnya.

public async Task Handle(OrderPlacedNotification n, CancellationToken ct)
{
    try { await _email.SendAsync(n.CustomerId, ct); }
    catch (Exception ex) { _logger.LogError(ex, "email failed"); }
}

Pola Peristiwa Domain

Pola yang umum adalah entitas mengumpulkan peristiwa domain, lalu setelah transaksi disimpan, Anda memublikasikan semuanya. Dengan demikian, peristiwa hanya dipicu ketika perubahan berhasil diterapkan.

await db.SaveChangesAsync(ct);
foreach (var domainEvent in order.Events)
    await publisher.Publish(domainEvent, ct);
order.Events.Clear();

Notifikasi Dibandingkan Antrean Pesan

Notifikasi MediatR berjalan dalam proses dan sinkron selama permintaan berlangsung. Untuk pengiriman lintas layanan atau pengiriman yang tahan lama, publikasikan pesan ke perantara pesan sungguhan, seperti RabbitMQ atau Azure Service Bus.

// In-process reactions  -> MediatR notifications
// Cross-service / durable -> message broker

Menguji Notifikasi

Anda dapat memastikan bahwa sebuah handler memublikasikan peristiwa yang benar dengan memberikan tiruan IPublisher, lalu memastikan bahwa publisher tersebut dipanggil.

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);

Pemeriksaan Singkat

Pastikan Anda memahami model notifikasi.

Ringkasan

Anda telah mempelajari notifikasi dan peristiwa:

  • INotification adalah siaran dengan nol atau lebih INotificationHandler.
  • Gunakan IPublisher.Publish untuk memanggil semua pelanggan.
  • Notifikasi memisahkan efek samping dan mengikuti prinsip terbuka/tertutup.
  • Notifikasi berjalan dalam proses; gunakan perantara pesan untuk peristiwa lintas layanan atau peristiwa yang tahan lama.

Dengan demikian, kursus CQRS dan MediatR telah selesai.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Notifikasi dan Peristiwa” gratis?

Ya — teks lengkap “Notifikasi dan Peristiwa” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Notifikasi dan Peristiwa”?

Publikasikan peristiwa domain dengan MediatR. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Notifikasi dan Peristiwa” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Konsep CQRS
  2. Perintah dan Handler dengan MediatR
  3. Perilaku Alur
  4. Notifikasi dan Peristiwa
← Kembali ke C# Academy