Giriş
Farklı nesneler arasındaki iletişim doğrudan bağlantılar yerine merkezi bir “arabacı” (mediator) üzerinden gerçekleştiğinde, Mediator Pattern sayesinde kodunuz loosely coupled, test edilebilir ve ölçeklenebilir olur.
MediatR kütüphanesi, .NET dünyasında bu deseni en kolay uygulamanızı sağlayan popüler bir araçtır.
Bu yazıda:
-
Mediator Pattern nedir?
-
MediatR ile kurulum ve temel kullanım
-
Katmanlı mimaride MediatR entegrasyonu
-
CQRS ile birlikte MediatR senaryosu
-
Performans ve test ipuçları

1. Mediator Pattern Temel Kavramları
-
Mediator (Aracı): Nesneler arasındaki tüm iletişimi kontrol eder.
-
Colleague (Katılımcı): Mediatör aracılığıyla haberleşen sınıflar.
-
Avantaj: Direct dependency’leri ortadan kaldırır.
-
Dezavantaj: Kompleks akışlar için mediator çok büyüyebilir.
2. MediatR ile Kurulum ve Temel Kullanım
A. NuGet Paketi
dotnet add package MediatR.Extensions.Microsoft.DependencyInjection
B. Program.cs Entegrasyonu
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));
C. Request & Handler Tanımı
// 1. Request
public record GetProductByIdQuery(int Id) : IRequest<ProductDto>;
// 2. Handler
public class GetProductByIdHandler
: IRequestHandler<GetProductByIdQuery, ProductDto>
{
private readonly IProductRepository _repo;
private readonly IMapper _mapper;
public GetProductByIdHandler(IProductRepository repo, IMapper mapper)
{
_repo = repo;
_mapper = mapper;
}
public async Task<ProductDto> Handle(
GetProductByIdQuery request, CancellationToken token)
{
var entity = await _repo.GetByIdAsync(request.Id);
return _mapper.Map<ProductDto>(entity);
}
}
D. Dispatch
public class ProductController : ControllerBase
{
private readonly IMediator _mediator;
public ProductController(IMediator mediator) => _mediator = mediator;
[HttpGet("{id}")]
public async Task<IActionResult> Get(int id)
{
var dto = await _mediator.Send(new GetProductByIdQuery(id));
return Ok(dto);
}
}
3. Katmanlı Mimari Entegrasyonu
| Katman | Sorumluluk |
|---|---|
| Domain / Application | GetProductByIdQuery, Handler sınıfları |
| Infrastructure | IProductRepository implementasyonları |
| API | ProductController ve IMediator çağrısı |
