Net Core ve Web API: Dynamic Mapping (AutoMapper)

Merhaba arkadaşlar, bildiğiniz üzere .Net Core ve Web API derslerine başladık. İlk dersimizde Dependecy Injection’a teorik bir giriş yapıp, Microsoft’un kendi Dependency Injection kütüphanesi ve 3rd party bir kütüphane olan Autofac’i kullanarak örnekler yaptık. O yazımıza da buradan ulaşabilirsiniz.

Database Entity’leri bir çok sebepten dolayı Frontend tarafta kullanılmaz. Entity Framework, adından da anlaşılacağı üzere entity’leri kullanır. Ve veritabanı işlemleri de bu entityler vasıtasıyla gerçekleşir. Peki eğer entity’leri frontend’te kullanamıyorsak, frontend’teki verileri nasıl veritabanına kaydedeceğiz? Modellerin yada Dto’ların değerlerinin entitylere setlenmesi gerekir. Her ne kadar küçük projeler çok yüksek miktarda property’lere sahip sınıfları barındırmasa da, projeler büyüdükçe ve modüllerin birbirleri olan ilişkileri fazlalaştıkça sınıfların içindeki property’lerin sayısı da artar. Dolayısıyla model/dto property değerlerinin entitylere setlenme işlemi güç bir hale gelir.

İşte bu noktada, AutoMapper devreye giriyor ve birkaç satır kodla devasa verileri nesneler arasında setleyebiliyoruz. Hadi başlayalım!

AutoMapper.Extensions.Microsoft.DependencyInjection

Yukarıdaki NuGet paketini projemize ekliyoruz.

public void ConfigureServices(IServiceCollection services)
    {
        services.AddAutoMapper(typeof(Startup));
        services.AddControllersWithViews();
    }

Startup sınıfımız içerisinde ConfigureServices methodunu yukarıdaki gibi AddAutoMapper() methodunu çağırarak projeye AutoMapper ekleme işlemi tamamlanır.

Şimdi aşağıdaki gibi SampleModel adında bir sınıf oluşturuyoruz.

public class SampleModel
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public DateTime Birthdate { get; set; }
    public string Job { get; set; }
}

Bu bizim ön tarafta verilerimizin tutulacağı sınıf olacak. Bunun dışında arka tarafta kullanılacak DataModel isimli sınıfı da aşağıdaki gibi oluşturuyoruz.

 public class DataModel
 {
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public DateTime Birthdate { get; set; }
    public string Job { get; set; }
 }

Şimdi AutoMapper kullanılarak bir SampleModel nesnesindeki datalar, DataModel sınıfından bir nesneye aktarılacak. Bu işlem için son bir adımımız kaldı ve o da MappingProfile sınıfını oluşturmak ve AutoMapper’a maplemelerin yapılacağı sınıfları bildirmek. Bunu yapabilmek adına SampleDataMappingProfile isminde aşağıdaki gibi bir sınıf oluşturuyoruz.

public class SampleDataMappingProfile:Profile
{
    public SampleDataMappingProfile()
    {
        CreateMap<SampleModel, DataModel>().ReverseMap();
    }
}

Dependency Injection yardımıyla AutoMapper instance’ını alıyoruz ve onun yardımıyla Maplemeyi yapıyoruz.

public class HomeController : Controller
{
    // AutoMapper nesnesi
    private readonly IMapper _mapper;
    public HomeController(IMapper mapper)
    {
        _mapper = mapper;
    }

    public IActionResult Index()
    {
        // model nesnesi yerine veri kaynağı olan nesne gelecek
        var model = new SampleModel() { Id = Guid.NewGuid(), Name = "Test", Surname = "Test", Birthdate = DateTime.Now };
        var mapped = _mapper.Map<DataModel>(model);
        return View();
    }
}

Gördüğünüz gibi model nesnesinin tüm değerleri olduğu gibi mapped nesnesine tek satır kodla aktarıldı. Bu yöntem, 4-5 tane property’si olan sınıflar için çok önemli olmasa da 30-40 property’li sınıflarda yazılımcıyı büyük bir yükten kurtarmaktadır. Bir sonraki derste görüşmek üzere. İyi Kodlamalar!

Leave a Reply

Your email address will not be published. Required fields are marked *