.NET 6 ile Object Mapping Kütüphanelerinin Generic Yapıda Kullanılması

Veri tabanındaki ilgili tabloya karşılık gelen entity sınıfı ile uygulamalarda entity sınıflarından göstermek istediğimiz propertylerden oluşan view model sınıfı arasında dinamik olarak mapping işlemi yapılmasını sağlayan object mapping kütüphaneleri mevcuttur. 

.NET dünyasında sıklıkla kullanılan kütüphaneler aşağıdaki gibi olup; mapping performansı, kolay kullanılabilirlik ve dokümantasyonu bakımından tercih edilebilmektedir.
AutoMapper, Mapster, TinyMapper vs.
Bu yazımda; projelerde kullanılacak kütüphane değişirse ya da yeni bir kütüphane eklenmek istenirse, kodun yapısını değiştirmeden kullanmak için dependency injection tekniği vasıtasyla generic bir yapı oluşturulmasına değindim. 


GenericObjectMapper isminde .NET 6 Web API projesi başta olmak üzere katmanlı mimari yapısında projeler oluşturuldu. Projem, açık kaynak olarak Github'da bulunmaktadır ve geliştirilmeye devam edilebilir durumdadır. 

Github Linki: GenericObjectMapper  

Generic Object Mapping konusunun projedeki önemli kodlarını özetleyecek olursak;

IMapper.cs

TSource: Kaynak sınıf, dönüştürülecek tip. 
    Örn: Entity

TDestination: Hedef sınıf, dönüştürülmesi hedeflenen tip. 
    Örn: ViewModel, DTO (Data Transfer Object)

IMapper interface dosyasındaki Map metodu, kaynaktan hedefe dönüştürme yapacak metot olup yazının devamında oluşturulacak mapping kütüphaneleri için oluşturulan sınıflara entegre edilecektir. 

AutoMapper kütüphanesi için oluşturulan sınıf: AutoMapperMapping

Bu sınıf, bütün mappingleri barındıran Profile türünden sınıf gönderilebilecek generic bir yapıdadır. Entegre edilen IMapper arayüzündeki Map metodunda önce, gelen profile sınıfı yapılandırmaya dahil edilerek AutoMapper kütüphanesine ait MapperConfiguration sınıfının CreateMapper metoduyla ayarlanır sonra, kaynak tipten hedef tipe mapping işlemini gerçekleştirir.

Mapster kütüphanesi için oluşturulan sınıf: MapsterMapping

Bu sınıf, entegre edilen IMapper arayüzündeki Map metodunda Mapster kütüphanesine ait Adapt metoduyla, kaynak tipten hedef tipe mapping işlemini gerçekleştirir.

TinyMapper kütüphanesi için oluşturulan sınıf: TinyMapperMapping

Bu sınıf, entegre edilen IMapper arayüzündeki Map metodunda TinyMapper kütüphanesine ait Bind metodu, kaynak tiple hedef tip arasında tek yölü mapping yapısı oluşturur ve thread-safedir. Map metoduyla mapping işlemini gerçekleştirir. 

Örnek senaryoda Northwind veri tabanı kullanılacak ve kategori detayı getirecek sorgudan kategori adı ve açıklamasını getirecek bir nesne döndürülecektir. Projede ORM aracı olarak EntityFrameworkCore kütüphanesi kullanıldı.

ICategoryService: Kategori işlemleri için kullanılan interfacedir.

CategoryManager : Kategori işlemlerinin yapıldığı iş metotlarını barındıran sınıftır. GetById metodunda kategori detayı getirilecek ve Category sınıfından CategoryDTO nesnesine mapping işlemi yapacaktır. 

CategoryDTO: Göstermek istenilen propertyleri barındıran sınıftır.

Category: Kategori için Northwind veri tabanındaki Categories tablosunun kolonlarını property olarak barındırır.

IOC yapısında kütüphane olarak Autofac kullanıldı. Sebebi, Program.cs dosyasındaki kalabalık kod yapısından kurtararak, bağımlılıkları tek bir dosyadan kontrol edebilmektir. AutofacBusinessModule sınıfı bu işi yapacaktır.

Business ve Data katmanındaki bağımlılıkları verdikten sonra Mapping bağımlılıklarını yönetebileceği kodların eklediği IOC yapısındaki sınıftır.

Mapster kütüphanesini kullanmak için aşağıdaki kod bloğu kullanılmalıdır. 
builder.RegisterType<MapsterMapping>().As<IMapper>().SingleInstance();
AutoMapper kütüphanesini kullanmak için aşağıdaki kod bloğu kullanılmalıdır. 
builder.RegisterType<AutoMapperMapping<CategoryProfile>>().As<IMapper>().SingleInstance();
CategoryProfile sınıfı, AutoMapper kütüphanesine ait Profile sınıfından miras alır. Kategori işlemlerine ait entity ve DTO sınıfları arasındaki mapping işlemlerinin kontrolü buradan yapılır.

TinyMapper kütüphanesini kullanmak için aşağıdaki kod bloğu kullanılmalıdır. 
builder.RegisterType<TinyMapperMapping>().As<IMapper>().SingleInstance();
Program.cs dosyasında Autofac entegrasyonu aşağıdaki gibi yapıldı. AutofacBusinessModule sınıfı, container yapılandırma ayarlarını yapan ConfigureContainer metodunda modül olarak verildi.

Kategori detayını test edecek olursak alınacakçıktı aşağıdaki gibidir. Sonuç olarak CategoryDTO tipinden bir veri beklenir.


Bu yazımda AutoMapper, Mapster, TinyMapper object mapping kütüphaneleri için generic yapıda ve dependency injection tekniği ile bağımlılığın yönetebileceğini örnek bir proje ile anlatarak değinildi.

Keyifli ve faydalı olmasını umarak, çalışmalarınızda kolaylıklar diliyorum.

Yorumlar