Perintah dan Handler dengan MediatR
Teruskan permintaan ke handler khusus.
Perintah dan Handler dengan MediatR adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.
Mendaftarkan MediatR
MediatR memindai rakitan Anda untuk menemukan handler. Daftarkan sekali saat startup dengan menunjuk ke rakitan yang berisi handler Anda.
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));IRequest
Pesan yang mengharapkan respons menerapkan IRequest<TResponse>. Parameter tipe tersebut adalah nilai yang dikembalikan handler.
public record CreateOrderCommand(int CustomerId, string[] Items)
: IRequest<int>; // returns the new order idPerintah Tanpa Result
Jika perintah tidak mengembalikan sesuatu yang bermakna, terapkan IRequest non-generik (yang merupakan singkatan dari IRequest<Unit>).
public record CancelOrderCommand(int OrderId) : IRequest;IRequestHandler
Handler menerapkan IRequestHandler<TRequest, TResponse> dan menyediakan metode Handle tempat pekerjaan dilakukan.
public class CreateOrderHandler
: IRequestHandler<CreateOrderCommand, int>
{
public Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
// create the order...
return Task.FromResult(newOrderId);
}
}Menginjeksi Dependensi
Handler diperoleh dari DI, sehingga handler dapat menerima context basis data, repositori, atau layanan lain melalui konstruktor.
public class CreateOrderHandler(AppDbContext db)
: IRequestHandler<CreateOrderCommand, int>
{
public async Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
var order = new Order { CustomerId = request.CustomerId };
db.Orders.Add(order);
await db.SaveChangesAsync(ct);
return order.Id;
}
}ISender
Untuk mengirimkan permintaan, injeksikan ISender (atau IMediator yang lebih luas) dan panggil Send. MediatR akan menemukan handler yang cocok.
public class OrdersController(ISender sender) : ControllerBase
{
[HttpPost]
public async Task<IActionResult> Create(CreateOrderCommand cmd)
{
int id = await sender.Send(cmd);
return CreatedAtAction(nameof(Get), new { id }, null);
}
}Send dalam API Minimal
API minimal menginjeksikan ISender secara langsung ke delegasi titik akhir.
app.MapPost("/orders", async (
CreateOrderCommand cmd, ISender sender) =>
{
var id = await sender.Send(cmd);
return Results.Created($"/orders/{id}", new { id });
});Kueri Hanyalah Permintaan
Kueri menggunakan mekanisme IRequest / IRequestHandler yang sama - satu-satunya perbedaan adalah maksudnya: handler membaca dan tidak pernah mengubah data.
public record GetOrderQuery(int Id) : IRequest<OrderDto?>;
public class GetOrderHandler(AppDbContext db)
: IRequestHandler<GetOrderQuery, OrderDto?>
{
public async Task<OrderDto?> Handle(
GetOrderQuery q, CancellationToken ct) =>
await db.Orders
.Where(o => o.Id == q.Id)
.Select(o => new OrderDto(o.Id, o.Total))
.SingleOrDefaultAsync(ct);
}Satu Handler untuk Setiap Permintaan
Untuk Send, tepat satu handler harus cocok dengan suatu tipe permintaan. Mendaftarkan nol atau dua handler untuk permintaan yang sama merupakan kesalahan konfigurasi.
// CreateOrderCommand -> exactly one CreateOrderHandlerMengembalikan Result yang Kaya
Respons dapat berupa tipe apa pun - DTO, pembungkus Result, atau bahkan hasil terbedakan - sehingga handler dapat menyatakan keberhasilan dan kegagalan secara eksplisit.
public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;Menguji Handler
Karena handler adalah kelas biasa dengan dependensi yang diinjeksi, Anda dapat mengujinya secara langsung - tanpa HTTP dan tanpa memerlukan pengendali.
var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);Pemeriksaan Singkat
Pastikan Anda memahami model pengiriman MediatR.
Ringkasan
Anda telah menerapkan perintah dan handler:
AddMediatRmemindai rakitan untuk mendaftarkan handler.- Pesan menerapkan
IRequest<T>; handler menerapkanIRequestHandler<TRequest, T>. - Injeksikan
ISenderdan panggilSenduntuk mengirimkan pesan; tepat satu handler akan cocok. - Kueri menggunakan kembali mekanisme yang sama dan tetap bebas dari efek samping.
Berikutnya: perilaku alur pemrosesan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Perintah dan Handler dengan MediatR” gratis?
Ya — teks lengkap “Perintah dan Handler dengan MediatR” 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 “Perintah dan Handler dengan MediatR”?
Teruskan permintaan ke handler khusus. 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 2 dari 4.
Berapa lama pelajaran “Perintah dan Handler dengan MediatR” 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
- Konsep CQRS
- Perintah dan Handler dengan MediatR
- Perilaku Alur
- Notifikasi dan Peristiwa