AutoMapper ve ProjectTo Kullanımı: Performans Optimizasyonu
Geliştirdiğimiz uygulamalarda, veritabanı sorgularının performansı büyük bir öneme sahiptir. ORM araçları bu konuda büyük kolaylık sağlasa da, doğru kullanılmadığında performans problemlerine yol açabilirler. Bu yazıda, AutoMapper’ın ProjectTo özelliğini kullanarak nasıl performans optimizasyonu sağlayabileceğimizi inceleyeceğiz.
AutoMapper Nedir?
AutoMapper, iki nesne arasındaki dönüştürme işlemlerini otomatikleştiren bir kütüphanedir. Bu sayede, nesneler arasında veri aktarımı sırasında manuel haritalama kodları yazmak zorunda kalmazsınız. Özellikle DTO (Data Transfer Object) kullanımı yaygın olan projelerde büyük kolaylık sağlar.
Manuel Mapping vs. AutoMapper Kullanımı
Manuel mapping işlemi, veritabanından verileri çekip DTO’lara manuel olarak haritalamayı içerir. Bu yöntem zaman alıcıdır ve hataya açıktır. Örneğin, müşteri ve sipariş bilgilerini çekmek ve DTO’ya dönüştürmek için aşağıdaki gibi bir kod yazmanız gerekir:
public async Task<List<CustomerDTO>> GetCustomersWithOrdersManual()
{
var customers = await _context.Customers
.Select(c => new
{
c.Id,
c.Name,
Orders = c.Orders.Select(o => new
{
o.OrderId,
o.OrderDate,
o.Total
}).ToList()
})
.ToListAsync();
var customerDTOs = new List<CustomerDTO>();
foreach (var customer in customers)
{
var customerDTO = new CustomerDTO
{
Id = customer.Id,
Name = customer.Name,
Orders = customer.Orders.Select(o => new OrderDTO
{
OrderId = o.OrderId,
OrderDate = o.OrderDate,
Total = o.Total
}).ToList()
};
customerDTOs.Add(customerDTO);
}
return customerDTOs;
}
AutoMapper kullanımı;
AutoMapper kullanarak aynı işlemi çok daha kısa ve bakım kolaylığı sağlayan bir şekilde yapabilirsiniz. İşte AutoMapper ile mapping örneği:
- AutoMapper Konfigürasyonu:
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Customer, CustomerDTO>();
CreateMap<Order, OrderDTO>();
}
}
2. Veritabanı Sorgusu:
public class CustomerService
{
private readonly IMapper _mapper;
private readonly AppDbContext _context;
public CustomerService(IMapper mapper, AppDbContext context)
{
_mapper = mapper;
_context = context;
}
public async Task<List<CustomerDTO>> GetCustomersWithOrders()
{
return await _context.Customers
.Include(c => c.Orders)
.ProjectTo<CustomerDTO>(_mapper.ConfigurationProvider)
.ToListAsync();
}
}
ProjectTo Nedir?
ProjectTo, AutoMapper’ın bir özelliğidir ve IQueryable arayüzü üzerinden çalışarak, veritabanı sorgularını doğrudan DTO’lara dönüştürür. Bu sayede, veritabanından sadece ihtiyaç duyulan veriler çekilir ve gereksiz veri transferi önlenmiş olur.
ProjectTo’nun Avantajları
- Performans Artışı:
- ProjectTo, sorgunun veritabanında çalıştırılmasını sağlar ve yalnızca gerekli olan verilerin çekilmesini temin eder. Bu sayede, gereksiz veriler sorgulanmaz ve bellek kullanımı minimize edilir. Lazy loading ve SELECT N+1 problemlerini önleyerek, veri çekme işlemlerinde ciddi performans artışı sağlar.
- Veritabanı sorgularının doğrudan DTO’lara bind edilmesi, gereksiz yükleme ve transfer maliyetlerini azaltır. Bu da daha hızlı ve verimli veri işlemleri sağlar.
- Örneğin, aşağıdaki sorgu yalnızca CustomerDTO içinde yer alan yani bize bu işlem için gerekli olan müşteri ve sipariş verilerini çeker:
var customers = dbContext.Customers
.ProjectTo<CustomerDTO>(_mapper.ConfigurationProvider)
.ToList();
2. Verimlilik:
- Manuel mapping kodları yazma ihtiyacını ortadan kaldırarak, kodunuzu daha temiz ve bakımı kolay hale getirir.
3. Bakım Kolaylığı:
- Dönüştürme işlemleri merkezi olarak yönetildiğinden, kodun bakımı ve güncellenmesi kolaylaşır. Mapping kurallarınızı tek bir yerde tanımlayabilir ve tüm projede bu kuralları kullanabilirsiniz.
4. Hata Azaltma:
- Manuel mapping hatalarının önüne geçilir. AutoMapper, haritalama kurallarını otomatik olarak uygular ve hataları minimize eder.
ProjectTo Kullanımı ve Sınırlamaları
ProjectTo kullanırken dikkat edilmesi gereken bazı noktalar vardır. ProjectTo, LINQ sorgularında son çağrılan olmalıdır. ORM’ler entitylerle çalışır, DTO’larla değil. Bu nedenle, filtreleme ve sıralama işlemlerini entity üzerinde uyguladıktan sonra, son adım olarak DTO’lara binding/mapping yapmalısınız. Ayrıca, tüm tip dönüşümlerinin mapping kurallarında açıkça ele alınması gerekmektedir.
Örneğin:
var customers = dbContext.Customers
.Where(c => c.IsActive)
.OrderBy(c => c.LastName)
.ProjectTo<CustomerDTO>(_mapper.ConfigurationProvider)
.ToList();
Sonuç
AutoMapper’ın ProjectTo özelliği, veritabanı sorgularında performans optimizasyonu sağlamak için güçlü bir araçtır. Bu özellik sayesinde, sadece ihtiyaç duyulan verileri sorgulayarak hem performansı artırabilir hem de kodunuzu daha temiz ve bakımı kolay hale getirebilirsiniz.
Umarım bu makale, AutoMapper’ın ProjectTo özelliği ile manuel mapping arasındaki performans farkını anlamanıza yardımcı olmuştur. Herhangi bir sorunuz veya geri bildiriminiz olursa her zaman bana ulaşabilirsiniz.
İyi çalışmalar!
Kaynaklar: