.Net Core AutoMapper Nedir ve Nasıl Kullanılır
Automapper nesnelerin karşılıklı olarak otomatik olarak maplenmesi görevini görür. Auto mapper’ın nasıl çalıştığı aşağıdaki örnek .Net Core projesi üzerinden gözlemleyelim.
Aşağıdaki resimde Work isimli classımızın içerisinde iki adet property yer alıyor. Ek olarak alttaki örnek classda gözükmeyen BaseEntity adlı class’dan inherit aldığı “Id” propertysi de mevcut.
public class Work:BaseEntity { public string Definition { get; set; } public bool IsCompleted { get; set; } }
Aşağıdaki resimde de WorkUpdateDto classımızı görüyoruz.
public class WorkUpdateDto { public int Id { get; set; } public string Definition { get; set; } public bool IsCompleted { get; set; } }
Automapper kütüphanesini kullanabilmemiz için eğer katmanlı mimari kullanıyorsak ilgili katmana tıklayarak, katmanlı mimari kullanmıyorsak solution üzerine sağ tıklayarak Manage NuGet Packages üzerinden browse sekmesi üzerinden aşağıdaki resimde olduğu gibi arama kısmına automapper yazarak ilgili kütüphaneyi projemize kuruyoruz.
Bu adımdan sonra aşağıdaki kod bloğunda olduğu gibi projemizde hangi classların birbiri ile mapleneceğini bildirmemiz gerekecek. Bunun için düzgün bir görüntü oluşturmak adına AutoMapper adlı bir klasör açıp altına WorkProfil isimli bir class oluşturuyoruz. Burada bu class Profile isimli classdan inherit olmasını gözden kaçırmayalım. İlgili usingleri projemize ekledikten sonra birbiri ile maplenecek classları aşağıda yer aldığı gibi belirtiyoruz. Burada ReverseMap() diyerek aynı işlemi <WorkUpdateDto,Work> içinde uygula demiş oluyoruz. Bu sebeple tekrardan aynı işlemin tersini yapmasını belirtmeye gerek kalmıyor. Burada özet olarak elimizdeki Work classını WorkUpdateDto’ya demiş olduk.
public class WorkProfile:Profile { public WorkProfile() { CreateMap<Work,WorkUpdateDto>().ReverseMap(); } }
Yukarıdaki adımı da uygulayarak artık birbiri ile hangi classların otomatik olarak mapleneceği bilgisini kurgulamış olduk. Bu adımdan sonra dependency injection yöntemi ile Automapper i kullanmak için yine Nuget Packages kısmından aşağıdaki AutoMapper.Extensions.Microsoft.DependencyInjection adlı kütüphaneyi kurmamız gerekiyor.
İlgili kütüphanemiz kurulduktan sonra projemizin Startup kısmına bu mapleme işleminin tamamlanması ve projemizin bunundan haberdar olması için ConfigureServices altında yukarıdaki adımlarda tanımlamasını yaptığımız Profil classımızı “services.AddAutoMapper(typeof(WorkProfile));” şeklinde belirtiyoruz.
public void ConfigureServices(IServiceCollection services) { services.AddDependencies(); services.AddControllersWithViews(); services.AddAutoMapper(typeof(WorkProfile)); }
Bu aşamadan sonra AutoMapper’ı kullanmaya ihtiyaç duyduğumuz yerlerde artık el ile manuel mapleme işlemi yapmadan kullanabiliriz. Örnek olarak aşağıdaki “WorkService classında örnek olarak AutoMapper öncesi ve sonrası bu işlemin örnek Create metodu için nasıl yapıldığına bakalım;
Öncelikle dependency injection aracılığı ile constructor üzerinden Imapper’ı DI olarak geçiyoruz. Aşağıda AutoMapper öncesi ve AutoMapper sonrası işlemin nasıl ilerlediğini inceleyebiliriz.
public class WorkService : IWorkService { private readonly IUow _uow; private readonly IMapper _mapper; public WorkService(IUow uow, IMapper mapper) { _uow = uow; this._mapper = mapper; } public async Task Create(WorkCreateDto workCreateDto) { #region AUTOMAPPER ÖNCESİ CREATE //public async Task Create(WorkCreateDto workCreateDto) //{ // await _uow.GetRepository<Work>().Create(new Work() // { // Definition = workCreateDto.Definition, // IsCompleted = workCreateDto.IsCompleted, // }); // await _uow.SaveChanges(); //} #endregion await _uow.GetRepository<Work>().Create(_mapper.Map<Work>(workCreateDto)); await _uow.SaveChanges(); } }
Burada tüm yazının özeti olarak , Create metodunun içerisinde kullandığımız AutoMapper işleminde en basit haliyle anlatımı _mapper.Map<BunaÇevir>(Bunu) şeklinde örnekleyebiliriz 🙂 Yukarıdaki örnek işlemde de region içinde yer alan AutoMapper öncesi kısımda da eşitliğin sağ tarafında kalan workCreateDto.Definition Work a manuel olarak çevir dediğimiz gibi, AutoMapper sonrası _mapper.Map<Work>(workCreateDto) yani workCreateDto ‘yu Work e maple demiş oluyoruz.