MediatR ile Komutlar ve İşleyiciler
İstekleri özel işleyicilere yönlendirin.
MediatR ile Komutlar ve İşleyiciler, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 2. 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.
MediatR'ı Kaydetme
MediatR, handler'ları keşfetmek için derlemelerinizi tarar. Başlangıçta bir kez kaydedin ve handler'larınızı içeren bir derlemeyi gösterin.
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));IRequest Arayüzü
Yanıt bekleyen bir ileti, IRequest<TResponse> uygular. Tür parametresi, handler'ın döndürdüğü şeydir.
public record CreateOrderCommand(int CustomerId, string[] Items)
: IRequest<int>; // returns the new order idSonuç Döndürmeyen Komutlar
Bir komut anlamlı bir şey döndürmüyorsa genel tür almayan IRequest'i uygulayın (IRequest<Unit> için kullanılan kısa yazımdır).
public record CancelOrderCommand(int OrderId) : IRequest;IRequestHandler Arayüzü
Handler, IRequestHandler<TRequest, TResponse> uygular ve çalışmanın gerçekleştiği Handle yöntemini sağlar.
public class CreateOrderHandler
: IRequestHandler<CreateOrderCommand, int>
{
public Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
// create the order...
return Task.FromResult(newOrderId);
}
}Bağımlılıkları Ekleme
Handler'lar DI üzerinden çözümlenir; bu nedenle oluşturucu aracılığıyla bir veritabanı için context, depolar veya başka hizmetler alabilirler.
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 Arayüzü
Bir isteği göndermek için ISender (veya daha kapsamlı IMediator) ekleyin ve Send çağrısını yapın. MediatR eşleşen handler'ı bulur.
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);
}
}Minimal API'lerde Send
Minimal API'ler, ISender'ı doğrudan uç nokta temsilcisine ekler.
app.MapPost("/orders", async (
CreateOrderCommand cmd, ISender sender) =>
{
var id = await sender.Send(cmd);
return Results.Created($"/orders/{id}", new { id });
});Sorgular da İsteklerden İbarettir
Sorgular aynı IRequest / IRequestHandler mekanizmasını kullanır; tek fark amaçtır: handler okur ve hiçbir zaman değişiklik yapmaz.
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);
}Her İstek İçin Bir Handler
Send için bir istek türüyle tam olarak bir handler eşleşmelidir. Aynı istek için sıfır veya iki handler kaydetmek bir yapılandırma hatasıdır.
// CreateOrderCommand -> exactly one CreateOrderHandlerZengin Sonuçlar Döndürme
Yanıt herhangi bir tür olabilir: bir DTO, sonuç sarmalayıcısı, hatta ayrıştırılmış bir sonuç. Bu, handler'ların başarıyı ve başarısızlığı açıkça ifade etmesini sağlar.
public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;Bir Handler'ı Test Etme
Bir handler, eklenmiş bağımlılıkları olan sıradan bir sınıf olduğundan doğrudan test edebilirsiniz; HTTP'ye veya denetleyiciye gerek yoktur.
var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);Hızlı Kontrol
MediatR'ın ileti gönderme modelini doğrulayın.
Özet
Komutları ve handler'ları uyguladınız:
AddMediatR, handler'ları kaydetmek için derlemeleri tarar.- İletiler
IRequest<T>uygular; handler'larIRequestHandler<TRequest, T>uygular. ISenderekleyin ve ileti göndermek içinSendçağrısını yapın; tam olarak bir handler eşleşir.- Sorgular aynı mekanizmayı yeniden kullanır ve yan etkisiz kalır.
Sırada: işlem hattı davranışları.
Sıkça Sorulan Sorular
“MediatR ile Komutlar ve İşleyiciler” dersi ücretsiz mi?
Evet — “MediatR ile Komutlar ve İşleyiciler” 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.
“MediatR ile Komutlar ve İşleyiciler” dersinde ne öğreneceğim?
İstekleri özel işleyicilere yönlendirin. 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 2. dersidir.
“MediatR ile Komutlar ve İşleyiciler” 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