AutoMapper nedir? Niçin kullanmalıyız?

AutoMapper nedir? Niçin kullanmalıyız?


AutoMapper bir nesne-nesne eşleştiricisidir. Nesne-nesne eşlemesi, bir türdeki bir girdi nesnesini farklı türden bir çıktı nesnesine dönüştürerek çalışır. AutoMapper'ı kullanılabilir kılan şey, A tipi modelin B tipi modele nasıl eşleneceğini bularak kirli işlerini ortadan kaldırmak için bazı ilginç kurallar sağlamasıdır.

AutoMapper Dökümanı

Kafanızda oturması adına iki adet modeli ele alalım.

class Foo{
	public int baz;
	public string name;
	public string lastName;
}

class Bar {
	public uint baz;
	public string name;
	public string surName;
}

Burada AutoMapper kullandığınızda tektek property eşlemesi yapmadan Foo ve Bar modellerini tek satırda eşleme yaparak farklı diğer modele cast edebilirsiniz. AutoMapper'ın güzelliğiyse tek seferlik yaptığınız bir yapılandırmayla her yerde aynı eşleme kod bloklarını çalıştırabilirsiniz. Yukarıdaki örnekten yola çıkacak olursak sadece bir yerde AutoMapper Foo modelindeki lastName propertiy'sini alıp Bar modelinin surName propertiy'sine yaz diyerek tek bir yerde kod yazarsanız bu otomatik olarak tüm projenizde uygulanacaktır. Güzel değil mi!

Hadi nasıl yapılır bir kaç örnek yapalım.

Nuget

PM> Install-Package AutoMapper

Projemize AutoMapper tanıtalım.

Şimdi Startup.cs girip ConfigureServices içerisinde aşağıdaki kodu yazalım.

services.AddAutoMapper(typeof(Startup));

Şimdi hangi modeller için bunu yapacak bunun için yapılandırma dosyası oluşturuyoruz. Profile sınıfını base alan bir class oluşturup ctor'unda yaptığımış işlemler AutoMapper tarafından tanınacak ve cast işlemlerinde dikkate alınacaktır. Aşağıda bulunan Tag için çift taraflı dönüştürme yapılandırılmıştır. Bu yapılandırma sonucunda aynı olan propertiylerin değerleri otomatik olarak diğer modele eşlenecektir. Eğer ki Foo ve Bar'daki farklı yapıda propertiyleriniz varsa onları da ForMember'lar kullanarak genişletebilirsiniz.

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<TagEntity, TagViewModel>();
        CreateMap<TagViewModel, TagEntity>();

        CreateMap<Foo, Bar>()
            .ForMember(dest => dest.lastName,
                opt =>
                    opt.MapFrom(src => src.surName)
            );

        CreateMap<Bar, Foo>()
            .ForMember(dest => dest.surName,
                opt =>
                    opt.MapFrom(src => src.lastName)
            );
    }
}

Yukarıda yapılan tüm işlemler yapılandırmaydı. Şimdi bu işlem için örnek verelim.

public class TagController : Controller
{
    private readonly IMapper _mapper;

    public TagController(IMapper mapper)
    {
        _mapper = mapper;
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(TagViewModel model)
    {
        var entity = _mapper.Map<TagEntity>(model);
        // TODO
        return RedirectToAction("Edit", "Tag", new {entity.Id});
    }

    public async Task<IActionResult> Edit(int id)
    {
        var entity = await db.Tags.FirstOrDefaultAsync(_ => _.Id == id);
        var model = _mapper.Map<TagViewModel>(entity);
        return View(model);
    }
}

Gördüğünüz gibi bir kaç satırda tüm model eşlememizi rahatlıkla yaptık. Bunu proje genelinde yaptığınızı düşünün ve Foo Bar örneğindeki gibi bir değişikliği rahatlıkla tek sayfada her yere uygulayabilme rahatlığını hissedin.

Size daha az, hızlı ve stressiz çalışma hayatı dilerim..

An error has occurred. This application may no longer respond until reloaded. Reload 🗙