Giriş
Gerçek dünya projelerinde, performans ve özelleştirme ihtiyaçları temel map işlemlerinin ötesine geçer.
Bu rehberde:
- ProjectTo ile EF Core Entegrasyonu
- BeforeMap & AfterMap Hook’ları
- Custom Resolver Senaryoları
- Nested & Koleksiyon Dönüşümleri
- Profil Test ve Doğrulama
- Performans İpuçları
- Yaygın Hatalar & Çözümleri
başlıklarıyla derinleşeceğiz.

1. ProjectTo ile EF Core Entegrasyonu
var dtos = _context.Products
.Where(p => p.Stock > 0)
.ProjectTo<ProductDto>(_mapper.ConfigurationProvider)
.ToList();
- SQL taraflı map, bellek ve CPU tasarrufu
- Yalnızca DTO alanları çekilir
2. BeforeMap & AfterMap Hook’ları
CreateMap<Order, OrderDto>()
.BeforeMap((src, dest) =>
src.Items = src.Items.Where(i => i.IsActive).ToList())
.AfterMap((src, dest) =>
dest.Total = dest.Items.Sum(i => i.Price * i.Quantity));
- BeforeMap: Kaynak temizleme
- AfterMap: Ek hesaplama
3. Custom Resolver Senaryoları
3.a. Yaş Hesaplama
public class AgeResolver : IValueResolver<User, UserDto, int>
{
public int Resolve(User src, UserDto dest, int _, ResolutionContext __) =>
DateTime.Today.Year - src.BirthYear;
}
CreateMap<User, UserDto>()
.ForMember(d => d.Age, o => o.MapFrom<AgeResolver>());
3.b. Adres Formatlama
public class AddressResolver : IValueResolver<User, UserDto, string>
{
public string Resolve(User src, UserDto dest, string _, ResolutionContext __) =>
$"{src.Street}, {src.City} {src.ZipCode}";
}
CreateMap<User, UserDto>()
.ForMember(d => d.FullAddress, o => o.MapFrom<AddressResolver>());
4. Nested & Koleksiyon Dönüşümleri
var orderDtos = _context.Orders
.Include(o => o.Items)
.ProjectTo<OrderDto>(_mapper.ConfigurationProvider)
.ToList();
- Navigational property’ler için
Include+ProjectTokullanın
5. Profil Test & Doğrulama
new MapperConfiguration(cfg => {
cfg.AddProfile<AgeProfile>();
cfg.AddProfile<OrderProfile>();
})
.AssertConfigurationIsValid();
- Test projesinde CI pipeline’da çalıştırın
6. Performans İpuçları
- Singleton Mapper
- ProjectTo öncelikli kullanın
- Basit MapFrom ifadeleri tercih edin
7. Yaygın Hatalar & Çözümleri
| Hata | Çözüm |
|---|---|
| Expression not translated | MapFrom içinde Linq dışı kodlardan kaçının |
| Missing Profile | AddAutoMapper içinde doğru assembly’yi taradığınızdan emin olun |
| Döngüsel referans | .MaxDepth() ve .PreserveReferences() kullanın |