AutoMapper , farklı türlere ait nesneleri eşlemek için kullanılabilen popüler bir nesneden nesneye eşleme kütüphanesidir. Örnek olarak, uygulamanızdaki DTO'ları (Veri Aktarım Nesneleri) model nesnelerine eşlemeniz gerekebilir. AutoMapper, bu tür uyumsuz türlerin bir veya daha fazla özelliğini manuel olarak eşleştirmek zorunda kalmanın yorucu çabalarını azaltır.

AutoMapper ile çalışmaya başlamak için Visual Studio'da bir proje oluşturmanız ve sonra AutoMapper'ı yüklemeniz gerekir. NuGet Paket Yöneticisi Konsolu penceresinde aşağıdaki komutu kullanarak AutoMapper'ı NuGet'ten yükleyebilirsiniz:

PM> Install-Package AutoMapper

AutoMapper kullanarak eşlemeler oluşturma

AutoMapper gibi bir nesneden nesneye eşleyici, bir türdeki giriş nesnesini başka türdeki bir çıkış nesnesine dönüştürür. Aşağıdaki iki sınıfı düşünün.

 public class AuthorModel
    {
        public int Id
        {
            get; set;
        }
        public string FirstName
        {
            get;set;
        }
        public string LastName
        {
            get; set;
        }
        public string Address
        {
            get; set;
        }
    }

 public class AuthorDTO
    {
        public int Id
        {
            get; set;
        }
        public string FirstName
        {
            get; set;
        }
        public string LastName
        {
            get; set;
        }
        public string Address
        {
            get; set;
        }
    }

Aşağıdaki kod snippet'i, AuthorModel ve AuthorDTO olmak üzere bu iki tür arasında nasıl harita oluşturabileceğinizi gösterir.

var config = new MapperConfiguration(cfg => {
                cfg.CreateMap();
            });

Sonra türler arasında eşleme gerçekleştirmek için aşağıdaki kod parçası kadar basittir.

IMapper iMapper = config.CreateMapper();
var source = new AuthorModel();
var destination = iMapper.Map(source);

Bir AutoMapper örneği 

Şimdi bazı verilerle çalışalım. Bazı verileri kaynak nesneye depolayan ve eşleme yapıldıktan sonra hedef nesnede özellik değerlerini görüntüleyen aşağıdaki kod parçasına bakın.

var config = new MapperConfiguration(cfg => {
                cfg.CreateMap();
            });
IMapper iMapper = config.CreateMapper();
var source = new AuthorModel();
source.Id = 1;
source.FirstName = "Joydip";
source.LastName = "Kanjilal";
source.Address = "India";
var destination = iMapper.Map(source);
Console.WriteLine("Author Name: "+ destination.FirstName + " " + destination.LastName);

Yukarıdaki kod parçasını yürüttüğünüzde, hedef nesnenin içinde saklanan yazar adı görüntülenir. Ancak, hedef FirstName ve hedef LastName özelliklerinin değerleri kaynak nesneyle aynı olacaktır, çünkü nesneleri AutoMapper!

AutoMapper'ın herhangi bir sınıf kümesini eşleyebileceğini unutmayın. Ancak, AutoMapper belirli kurallara uyar; bunlardan biri eşlenen özellik adlarının aynı adlara sahip olması gerektiğidir. Özellik adları aynı değilse, AutoMapper'a özelliklerin nasıl eşlenmesi gerektiğini bildirmeniz gerekir. Contact ve ContactDetails adlı iki özelliği eşlemek istediğimizi varsayarsak, aşağıdaki örnek bunun nasıl başarılabileceğini göstermektedir.

var config = new MapperConfiguration(cfg => {
                cfg.CreateMap()
                .ForMember(destination => destination.ContactDetails,
               opts => opts.MapFrom(source => source.Contact));
            });

Hedef nesneyi oluşturmak için kullanılan aşağıdaki ifadeye dikkat edin.

var destination = iMapper.Map(source);

Hedef nesne zaten varsa, bunun yerine aşağıdaki ifadeyi kullanabilirsiniz.

iMapper.Map(sourceObject, destinationObject);

Esasen, yukarıdaki kod snippet'i, zaten var olan iki nesneyi eşlemek için kullanılabilir.

AutoMapper'da projections kullanma:

Şimdi bir projectionsa bakalım. Örneğin, aşağıdaki sınıfı düşünün.

public class Address
    {
        public string City { get; set; }
        public string State { get; set; }
        public string Country { get; set; }
    }

AuthorModel sınıfımızın, yazarların adres bilgilerini depolamak için Adres sınıfını kullanmasını sağlayalım. Güncellenmiş AuthorModel sınıfının görünüşü şöyledir.

public class AuthorModel
    {
        public int Id
        {
            get; set;
        }
        public string FirstName
        {
            get;set;
        }
        public string LastName
        {
            get; set;
        }
        public Address Address
        {
            get; set;
        }
    }

 Ve burada güncellenmiş AuthorDTO sınıfı.

public class AuthorDTO
    {
        public int Id
        {
            get; set;
        }
        public string FirstName
        {
            get; set;
        }
        public string LastName
        {
            get; set;
        }
        public string City { get; set; }
        public string State { get; set; }
        public string Country { get; set; }
    }

Şimdi diyelim ki AuthorDTO ve AuthorModel sınıflarını eşlememiz gerekiyor. Aşağıdaki kod snippet'i bunun nasıl başarılabileceğini gösterir.

var config = new MapperConfiguration(cfg => {
                cfg.CreateMap()
                   .ForMember(destination => destination.Address,
              map => map.MapFrom(
                  source => new Address
                  {
                      City = source .City,
                      State = source .State,
                      Country = source.Country
                  }));