Automapper

Bu aracı 2017 den beri kullanıyorum sanırım. İlk olarak açık kaynaklı NopCommerce kodlarında görmüştüm. Bildiğim kadarıyla da .net frameworkte (şuan aktif olarak core 6.0 kullanıyorum) standart olarak benzeri bir kütüphane yok ya da ben bilmiyorum. Genelde projeye onu eklemeyi unutarak başlıyorum ve bir yerden sonra nesneleri birbirine eşlemek vakit kaybı ve sıkıcı olmaya başlıyor. Hemen sonrasında Automapper ‘la yoluma devam ediyorum.

Automapper kısaca bir nesneyi diğer bir nesneye eşitlemek için kullanılıyor. Tek tek değerleri eşitlemek yerine Automapper nerdeyse hiç bir ek ayarlama yapmadan sizin yerinize eşitliyor.

Benim genellikle kullandığım yapı bu aralar şu şekilde : CQRS pattern kullanıyorum, API ‘ye gelen request nesnelerim var (Query ya da Command ), buradan gelen istekleri işlem yapacak servise göndermeden önce DTO ‘ya (Data Transfer Object) dönüştüyorum dönen değeri Response nesnesine dönüştürüyorum. Response nesnesini API ‘den geri gönderirken VM ‘e (View Model) dönüştürüyorum. Birbirine çok benzeyen bu nesneleri birbirine eşitlemek için çok fazla satır yazmak gerekiyor. İşte Automapper burada bize yardımcı oluyor.

Önce aşağıdaki gibi projemize AutoMapper.Extensions.Microsoft.DependencyInjection paketini yüklüyoruz.

dotnet add "xx.csproj" package "AutoMapper.Extensions.Microsoft.DependencyInjection"

Program.cs içerisine aşağıdaki satırı ekliyoruz:

builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

Bundan sonra Automapper Profile sınıfından extend edilmiş bir sınıf içerisinde birbirine eşitlenecek sınıfları CreateMap metoduna parametre olarak gönderiyoruz. Benim örnek sınıfım aşağıdaki şekilde :

public class MappingProfiles :Profile
{
     public MappingProfiles() {
        CreateMap<CreateProductCommandRequest, DTO.Product.CreateProduct>();
        CreateMap<Product, DTO.Product.ProductInfo>();
        CreateMap<DTO.Product.ProductInfo, CreateProductCommandResponse >();
    }
}

Bu tanımlamalardan sonra kullanmak için IMapper interface ‘ini sınıfımıza ekleyip, Map fonksiyonu ile eşitlememizi hızlıca yapıyoruz.

public class ProductController
{
    readonly private IMapper _mapper;
    
    public ProductController(IMapper mapper)
    {
        _mapper = mapper;
    }

    public CreateFunction (CreateProductCommandRequest request)
    {
        DTO.CreateProduct createProduct = _mapper.Map<DTO.CreateProduct >(request);
    }
}

Automapper “Before and After Map Actions, Conditional Mapping” gibi bir kaç özellik daha sunuyor. Tüm bunları burada ki kendi dokümanlarında bulabilirsiniz.

Kaynaklar :

https://docs.automapper.org/en/latest/Conditional-mapping.html

https://www.gencayyildiz.com/blog/asp-net-coreda-automapper-kullanimi/

Yorum yapın