ASP.Net Core Automapper Kullanımı
Herkese merhaba, bugün automapper nedir ve nasıl kullanılir konusunu ele alacağım. Automapper en temelde business objelerinizle DTO (data transfer view) objelerinizi eşlemek maksadıyla kullanılmaktadır. Uygulamanız uyumsuz türlerin karmaşık bir eşlemesini gerektirdiğinde AutoMapper’ı kullanabilirsiniz. Eğer uygulamanızda fazlaca map’leme işlemi yapacaksanız oldukça kısa ve hızlı bir çözüm sunmaktadır.
Automapper gibi başka kütüphanelerde mevcut. Örneğin Mapster,ExpressMapper,TinyMapper, AgileMapper.
Şimdi projemize nasıl entegre edebiliriz ona bakalım.
1-) İlk önce gerekli NuGet paketlerini yüklüyoruz.
. dotnet add package AutoMapper
. dotnet add package AutoMapper.Extensions.Microsoft.DependencyInjection
2-) Daha sonra Program.cs sınıfında yapılandırıyoruz.
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
3-) Model sınfını oluşturalım.
public class Credit : BaseEntity
{
[Key]
public int Id { get; set; }
public string CreditName { get; set; }
public double LoanAmount { get; set; }
public float InterestRate { get; set; }
public int LoanTerm { get; set; }
public bool IsActive { get; set; }
public DateTime FirstInstallmentDate { get; set; }
public int BankId { get; set; }
public int AppUserId { get; set; }
public virtual Bank Bank { get; set; }
public virtual AppUser AppUser { get; set; }
public virtual ICollection<CreditInstallments> CreditInstallments { get; set; }
}
4-) View Modeli oluşturalım.
public class ListCreditViewModel
{
public int Id { get; set; }
public string CreditName { get; set; }
public bool IsActive { get; set; }
public DateTime StartDate { get; set; }
public int Progress { get; set; }
public string BankImage { get; set; }
}
5-) Credit ile ListCreditViewModel class’ları arasındaki veriyi “AutoMapper” aracılığı ile eşlemek için CreditMapper sınıfımızı Profile sınıfından türeterek oluşturalım.
public class CreditMapper : Profile
{
public CreditMapper() {
CreateMap<Credit, ListCreditViewModel>();
}
}
6-) Eğer veriyi direkt maplemek yerine değişiklik yapıp eşlemek istiyorsanız veya ilişkili olduğu tablodan veri çekip eşlemek isterseniz custom olarak ayarlamanız gerekmektedir.
public class CreditMapper : Profile
{
public CreditMapper() {
CreateMap<Credit, ListCreditViewModel>()
.ForMember(dest => dest.Progress, opt => opt.MapFrom(src =>
Convert.ToInt32((double)(src.CreditInstallments.Count(a => a.IsApprov) / src.LoanTerm) * 100)))
.ForMember(dest => dest.StartDate, opt => opt.MapFrom(src => DateTime.Now))
.ForMember(dest => dest.BankImage, opt => opt.MapFrom(src => src.Bank.ImageUrl));
}
}
7-) Automapper’ı servisimize dahil edelim.
private readonly IMapper _mapper;
public CreditService(IMapper mapper)
{
_mapper = mapper;
}
8 -) Son olarak nasıl kullanıldığına bakalım.
public List<ListCreditViewModel> GetUsersCredit()
{
var creditList = _creditRepository.GetAll()
.Include(n => n.CreditInstallments)
.Include(x => x.Bank)
.ToList();
var listView = _mapper.Map<List<ListCreditViewModel>>(creditList);
return listView;
}
Automapper kullanmasaydık aşağıdaki şekilde yapmamız gerekecekti.
public List<ListCreditViewModel> GetUsersCredit()
{
var creditList = _creditRepository.GetAll()
.Include(n => n.CreditInstallments)
.Include(x => x.Bank)
.ToList();
var listView = creditList.Select(x => new ListCreditViewModel
{
Id = x.Id,
CreditName = x.CreditName,
IsActive = x.IsActive,
Progress = Convert.ToInt32((double)(x.CreditInstallments.Where(a => a.IsApprov == true).Count()) / (x.LoanTerm) * 100),
StartDate = DateTime.Now,
BankImage = x.Bank.ImageUrl
});
return listView;
}
Eğer çok fazla mapleme işlemi yapıyorsanız automapper sizi çok hızlandıracaktır.
Kendi sitesinden dökümanına bakabilirsiniz. https://automapper.org/