En başta DTO yani Data Transfer Object kullanım alanını açıklamak gerekirse, bir kaynaktan aldığımız veriyi, kullanacağımız yere göre hazırladığımız sınıflara DTO denir. Bu dil bağımsız bir yöntemdir.
Verilerimizi her zaman veritabanında sakladığımız gibi göstermek istemeyebiliriz. Örnek vermek gerekirse veritabanında bir müşterinin adını ve soyadını farklı alanlarda tutup, UI’da birleşik göstermek için DTO sınıfları oluştururuz yada bir tablonun CRUD işlemleri için farklı DTO’lar oluşturabiliriz.
DTO kullanımına en sık .NET ile yazanların Entity Nesneleri için kullandıklarınıda görebilirsiniz.
Örnekleyelim. Çalışan ve departman için iki sınıfımızın olduğunu düşünelim.
public class Member
{
public string Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string Photo { get; set; }
public Departments Department { get; set; }
}
public class Departments
{
public string Id { get; set; }
public string Name { get; set; }
}
Çalışan listesi olan bir sayfada ise çalışan adı, resmini ve departmanını göstermek isteyelim.
public class MemberDto
{
public string Id { get; set; }
public string FullName { get; set; }
public string Photo { get; set; }
public string Department { get; set; }
}
Burada tek yapmamız gereken aldığımız verileri istediğimiz sınıfa çevirmek. Burada yardımımıza Nuget Package Manager’den indirebileceğiniz AutoMapper koşuyor. İki sınıf arasında verileri dönüştürmemize yarıyor.
Burada .Net Core üzerinden gideceğim ama DTO ve Mapping framework veya dil bağımlı bir yapı değildir.
Nuget üzerinden “AutoMapper” ve “AutoMapper.Extensions.Microsoft.DependencyInjection” indiriyoruz ve daha sonra Startup’a gelip Configuration altına aşağıdaki satırımızı yazmamız ile bağımlılığımızı ekliyoruz.
service.AddAutoMapper();
Tek yapmamız gereken ise AutoMapper için Helper class’ımızı oluşturmak.
CreateMap<Member, MemberDTO>()
.ForMember(dest => dest.FullName, opt =>
{
opt.MapFrom (src => src.Name + " " + src.Surname);
})
.ForMember(dest => dest.Department, opt =>
{
opt.MapFrom (src => src.Department.Name);
});
Bu helper ile ayrı iki property’miz olan Name ve Surname’i tek bir property haline getiriyoruz ve Department için, ilgili Department nesnesinin içindeki Name’i alarak Department property’sini dönüyoruz.
Artık bu DTO’muzu istediğimiz yerden çağırabiliriz.