Giriş

Gerçek dünya projelerinde, performans ve özelleştirme ihtiyaçları temel map işlemlerinin ötesine geçer.
Bu rehberde:

  1. ProjectTo ile EF Core Entegrasyonu
  2. BeforeMap & AfterMap Hook’ları
  3. Custom Resolver Senaryoları
  4. Nested & Koleksiyon Dönüşümleri
  5. Profil Test ve Doğrulama
  6. Performans İpuçları
  7. Yaygın Hatalar & Çözümleri

başlıklarıyla derinleşeceğiz.

automapper-custom-resolver-akis

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 + ProjectTo kullanı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

By tanju.bozok

Software Architect, Developer, and Entrepreneur

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir