0Pricing
C# Academy · Pelajaran

Perilaku Alur

Tambahkan logika lintas fungsi dengan perilaku.

Perilaku Alur adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.

Perhatian Lintas Fungsi

Pencatatan log, validasi, pengukuran waktu, dan transaksi berlaku untuk banyak handler. Menyalin kode tersebut ke setiap handler bersifat berulang dan rentan terhadap kesalahan.

Perilaku alur pemrosesan MediatR memungkinkan Anda membungkus setiap permintaan dengan logika bersama.

// One behavior runs around all handlers

IPipelineBehavior

Perilaku menerapkan IPipelineBehavior<TRequest, TResponse>. Metode Handle-nya menerima permintaan dan delegasi next yang memanggil bagian alur pemrosesan berikutnya.

public class LoggingBehavior<TRequest, TResponse>
    : IPipelineBehavior<TRequest, TResponse>
    where TRequest : notnull
{
    public async Task<TResponse> Handle(
        TRequest request,
        RequestHandlerDelegate<TResponse> next,
        CancellationToken ct)
    {
        // before
        var response = await next();
        // after
        return response;
    }
}

Delegasi Berikutnya

next() memanggil perilaku berikutnya, atau handler sebenarnya jika ini adalah perilaku terakhir. Kode sebelum pemanggilan berjalan saat masuk; kode setelahnya berjalan saat keluar.

// [Behavior A in] -> [Behavior B in] -> [Handler]
//               <- [Behavior B out] <- [A out]

Perilaku Pencatatan Log

Perilaku pencatatan log konkret mencatat nama permintaan saat masuk dan waktu yang telah berlalu saat keluar.

public async Task<TResponse> Handle(
    TRequest request,
    RequestHandlerDelegate<TResponse> next,
    CancellationToken ct)
{
    var name = typeof(TRequest).Name;
    _logger.LogInformation("Handling {Name}", name);
    var sw = Stopwatch.StartNew();
    var response = await next();
    _logger.LogInformation("{Name} took {Ms}ms", name, sw.ElapsedMilliseconds);
    return response;
}

Mendaftarkan Perilaku

Daftarkan perilaku generik terbuka dalam DI. MediatR akan menerapkannya pada setiap permintaan.

builder.Services.AddTransient(
    typeof(IPipelineBehavior<,>),
    typeof(LoggingBehavior<,>));

Perilaku Validasi

Salah satu penggunaan yang populer adalah validasi permintaan dengan FluentValidation. Perilaku ini menjalankan semua validator sebelum handler dieksekusi dan melemparkan pengecualian jika ada yang gagal.

public async Task<TResponse> Handle(
    TRequest request,
    RequestHandlerDelegate<TResponse> next,
    CancellationToken ct)
{
    var context = new ValidationContext<TRequest>(request);
    var failures = _validators
        .Select(v => v.Validate(context))
        .SelectMany(r => r.Errors)
        .Where(f => f is not null)
        .ToList();
    if (failures.Count != 0)
        throw new ValidationException(failures);
    return await next();
}

Penghentian Awal

Perilaku dapat melewati handler sepenuhnya dengan mengembalikan nilai tanpa memanggil next() - berguna untuk menyimpan hasil kueri dalam tembolok atau menolak permintaan yang tidak valid.

if (_cache.TryGet(key, out TResponse cached))
    return cached;          // handler never runs
var response = await next();
_cache.Set(key, response);
return response;

Mengurutkan Perilaku

Perilaku dieksekusi sesuai urutan pendaftarannya. Letakkan pencatatan log di lapisan terluar, lalu validasi, kemudian transaksi, sehingga masing-masing membungkus bagian berikutnya dengan benar.

services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(TransactionBehavior<,>));

Perilaku Transaksi

Bungkus handler perintah dalam transaksi basis data agar seluruh operasi diterapkan atau dibatalkan secara atomik.

await using var tx = await _db.Database.BeginTransactionAsync(ct);
try
{
    var response = await next();
    await tx.CommitAsync(ct);
    return response;
}
catch
{
    await tx.RollbackAsync(ct);
    throw;
}

Menargetkan Permintaan Tertentu

Gunakan antarmuka penanda dan batasan generik agar perilaku hanya berlaku pada permintaan yang memilih untuk menggunakannya - misalnya, hanya perintah yang mendapatkan transaksi.

public interface ITransactional { }
public record CreateOrderCommand(...) : IRequest<int>, ITransactional;

// where TRequest : ITransactional

Mengapa Perilaku Lebih Baik daripada Middleware

Berbeda dengan middleware HTTP, perilaku berjalan per pesan, memiliki permintaan dan respons bertipe, serta tetap berfungsi meskipun permintaan dikirimkan di luar HTTP (misalnya dari pekerjaan latar belakang).

// Strongly typed, transport-independent cross-cutting logic

Pemeriksaan Singkat

Pastikan Anda memahami cara kerja perilaku.

Ringkasan

Anda telah mempelajari perilaku alur pemrosesan:

  • IPipelineBehavior<TRequest, TResponse> membungkus setiap permintaan dengan logika bersama.
  • Delegasi next memajukan alur pemrosesan; melewatinya akan menghentikan handler lebih awal.
  • Penggunaan umum: pencatatan log, validasi, transaksi, dan penembolokan.
  • Perilaku berjalan sesuai urutan pendaftaran dan memiliki tipe yang kuat.

Berikutnya: notifikasi dan peristiwa.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Perilaku Alur” gratis?

Ya — teks lengkap “Perilaku Alur” 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 “Perilaku Alur”?

Tambahkan logika lintas fungsi dengan perilaku. 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 3 dari 4.

Berapa lama pelajaran “Perilaku Alur” 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