AutoMapper kullanımı ve Dto Mantığı

DATA TRANSFER OBJECT (DTO)

Veri tablosundan veriyi aldınız ve ilgili modelle maplediniz. İlgili modelin veri tablosundan aldığı bilgiyle maplenebilmesi için veri tablosu kolonlarıyla, modelin propertyleri isim ve tip olarak eşleşmeli. Ancak siz bu veriyi modeldeki gibi direkt olarak programınızda kullanmak istemiyor olabilirsiniz. Örneğin veri tabanından çekilen veride isim, soyisim ayrı propertylerdedir. Sizin tek property olarak kullanmanız gerekir ya da iki farklı veri tablosundan maplediğiniz iki modelden gelen propertyleri harmanlayarak bir model oluşturmanız gerekebilir. İşte veri tabanından mapplenen modelleri uygulama içerisinde kullanacağınız modelle aktardığınızda bu modeller dto olarak adlandırılır.

AUTOMAPPER KULLANIMI

Kodlamaya başlamadan önce ilk yapmamız gereken nuget paket managerdan Automapper paketini indirmektir. Automapper verileri bir obje tipinden başka bir obje tipine kopyalamanıza yardımcı olur. Peki böyle bir yapıya neden ihtiyacımız var. Elimizde aşağıdaki gibi bir nesne olduğunu varsayalım.

 Person p = new Person();

 p.FirstName = "Cagatay";
 p.LastName = "KIZILTAN";
 p.Number="000000000";
 p.Salary="4000";

vs şeklinde giden.

ve bu nesneyi başka bir classın nesnesine aktarmamız gerektiğini varsayalım. Şuan için yapacağımız şey

 Employee e = new Employee();

 e.FirstName = p.FirstName;
 e.LastName = e.LastName;
 e.Number = e.Number;

Employeeda salarye ihtiyacımızın olmadığını varsayalım. Şuan için herşey normal ve olması gerektiği şekilde ilerliyor gibi gözüküyor. Ancak kopyalanan nesnelerin sayısı arttığında yani tekrar tekrar kopyalama yapıldığında veya source nesneyle destination nesne arasında property farklılıkları bulunduğunda işler sıkıntıya girmekte. Bu işlemi kolaylaştırmak için Automapper ile kopyalama işlemini otomatik olarak halledebiliriz.

Aşağıdaki gibi Person ve Employee adında iki adet modelimiz olsun. Burada amacımız Person modeli yani source modelden Employee modeline nesne propertysilerini kopyalayacağız ancak dikkat etmemiz gereken durum, Person modelinde number propertysi varken Employee  nesnesinde bu yok ve Salary propertysi var.

  public class Person
  {
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public string Number { get; set; }
  }

  public class Employee
  {
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public string Salary { get; set; }
  }

Aşağıda main metod içerisinde person nesnesi yaratılmış ve propertyleri doldurulmuştur. Automap kullanımı iki aşamadan oluşur. Mapin yaratılması ve mapin kullanılması. Create map yorum satırının hemen aşağısında config isminde tanımlanan değişkende oluşturulacak map nesnesinin ayarları belirlenir. Şuan için sadece Source modelin person , destination modelin Employee modeli olacağını söyledik. Hemen aşağısında da bu ayarlara üzerinden bir mapper yani nesne mapleyici yaratılır.

 static void Main(string[] args)
 {
   Person per = new Person();

   per.FirstName = "Cagatay";
   per.LastName = "Kızıltan";
   per.Number = "055555555";
 
   //Create a map
   var config = new MapperConfiguration( cfg => { cfg.CreateMap<Person,Employee>(); });

   IMapper mapper = config.CreateMapper();

   //Use the created map
   var dest = mapper.Map<Person, Employee>(per);
 }

Daha sonra Imapper interfacesi üzerinden mapper nesnesine atadığımız Createmapper nesnesi bize , bizim verdiğimiz ayarlar üzerinden Person nesnelerini Empoyee nesnelerine mappleme imkanı sunar. Eşleşmeyen kayıtlar da null olarak geçer.

 var dest = mapper.Map<SourceModelType, DestinationModelType>(SourceModelObject);

işlem sonucundavar dest’ değişkenimiz bir employee nesnesi olacak ve persondan gelen bilgileri tutacak.

Peki bu mappleme işlemi tam olarak nasıl yapılıyor ?

Bu mappleme işlemi biz aksini söylemedikçe aynı isimli propertylerin birbiriyle eşleşmesi şeklinde ilerliyor. Eğer property isimleri farklı olursa örneğin Firstname –> FName bu durumda mappleme yapılamaz. Ancak biz Map configurasyonlarını tanımladığımız kısımda bununla ilgili ayarları yazarsak bu mapleme de mümkün olur.

  • Aşağıda Source modeldeki yani Person modelindeki FirstName propertysinin , Destination modeldeki yani Employeedeki FName propertysine eşleneceği söyleniyor.
//Create a map
 var config = new MapperConfiguration(cfg => {   
      cfg.CreateMap<Person, Employee>().ForMember( dest=> dest.FName, from=> from.MapFrom(s=> s.FirstName)  ); } );

 IMapper mapper = config.CreateMapper();

 //Use the created map
 var dest = mapper.Map<Person, Employee>(per);

  • Bunu biraz daha değiştirip source modelden gelen iki propertyi destination modelde tek propertyde birleştirebiliriz.
 //Create a map
 var config = new MapperConfiguration(
 cfg => {  cfg.CreateMap<Person, Employee>().ForMember( dest=> dest.FName, from=> from.MapFrom(s=> s.FirstName+ " - " + s.LastName) ); }   );
 
  IMapper mapper = config.CreateMapper();
   
//Use the created map
  var dest = mapper.Map<Person, Employee>(per);

 

You may also like...

1 Response

  1. selman dedi ki:

    Merhaba;
    ilk paragrafın son 3 cümlesindeki nesne tanımı dto’nun değil de business object’in tanımı olabilir mi? dto biraz daha client’a göndereceğimiz nesneyi tanımlıyor diye okudum diğer kaynaklarda. Karıştırıyor olabilirim; entity, model, business object, dto.. bayağı şey var.

Bir yanıt yazın

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