Asp.net Core 3.1. Mapper Kavramı ve AutoMapper – A&A – Part 4

Merhabalar ;

Bu post içerisinde Kısaca “Mapper” kavramına değinip A&A projemize AutoMapper implementasyonu yapacağız.

Mapper’a neden ihtiyaç duyarız ?

Geliştirdiğimiz uygulamalarda son kullanıcıya açtığımız Servislerde,Api’larda veritabanından çektiğimiz sonuç entity’sini direk dönmek istemeyiz.(ORM kullandığımızı varsayıyorum). Bunun çeşitli nedenleri vardır.

Örneğin bir GetUserCountry diğer bir servisimiz olsun ve içerisinde UserName ve Country dönsün. Eğer biz gelen entityleri direk dönseydik şöyle bir sonuç ortaya çıkabilirdi. (DB tasarımına takılmayın)

UserEntity.cs

  • UserId
  • Username
  • Name
  • Surname
  • BirthDate
  • Country
  • ActivationStartDate
  • ActivationEndDate
  • Status
  • IsDeleted

Repomuzdan dönen bu sonucu direk kullanıcıya vermek çok akıllıca bir yöntem olmasa gerek. 🙂 ( 2 adet prop. dönecekken gereksiz yere 10 adet prop. dönmek Performans , Güvenlik gibi problemler ortaya çıkacaktır.)

Bu gibi durumlar için Domain Transfer Object ( DTO ) veya Business Object ( BO ) gibi isimlendilen objeler ile sadece Api için gerekli alanları içeren bir nesne yaratılır ve bu nesle entityden set edilerek servis sonucu olarak döndürülür.

Bir örnek vermek gerekirse ;

GetUserCountryDTO.cs

  • UserName
  • Country

Repomuzdan dönen entitymizi DTO muzda gereken alanlara manuel olarak set ederek , kendi mapperimizi yazıp kullanarak veya Automapper gibi kütüphanelerden yararlanarak DTO larımızın içerisini doldurabiliriz.

Asp.Net Core 3.1. ‘de AutoMapper Kullanımı

İlk olarak package manager consolu açıp WebApi Projesini seçip Automapper’ı son sürüm olarak yüklüyoruz.

install-package AutoMapper

Daha sonra Core -> Authentication.Domain projesi altına AutoMapperin map etmek için ihtiyaç duyduruğu mapping ayarlarının yapıldığı classı Create ediyoruz.

User.cs
    public virtual string UserName { get; protected set; }
    public virtual string Name { get; protected set; }
    public virtual string SurName { get; protected set; }
    public virtual string Email { get; protected set; }
    public string Password { get; protected set; }
    public virtual string PasswordSalt { get; protected set; }
    public virtual long CreatorUserId { get; protected set; }
    public virtual long? ModifierUserId { get; protected set; }
    public virtual DateTime CreationTime { get; protected set; }
    public virtual DateTime? LastModTime { get; protected set; }
    public virtual UserDetail UserDetail { get; protected set; }
    public virtual bool IsDeleted { get; protected set; }
    public virtual ICollection UserRoles { get; protected set; }

public class ValidateUserResponseDTO : ResponseDTOBase
     {
         [DataMember]
         public string UserName { get; set; }
         [DataMember]
         public string Name { get; set; }
         [DataMember]
         public string SurName { get; set; }
         [DataMember]
         public string Email { get; set; }
         [DataMember]
         public string Token { get; set; }
         [DataMember]
         public string RefreshToken { get; set; }
         [DataMember]
         public DateTime TokenExpireDate { get; set; }
 }



[DataContract]
     public class GetUserResponseDTO : ResponseDTOBase
     {
         [DataMember]
         public string UserName { get; set; }
         [DataMember]
         public string Name { get; set; }
         [DataMember]
         public string SurName { get; set; }
         [DataMember]
         public string Email { get; set; }
 }



     [DataContract]
     public class GetUserListResponseDTO : ResponseDTOBase
     {
         [DataMember]
         public List Users { get; set; }
     }

Daha sonra Web.Api altında yer alan startup.cs e aşağıda yer ala tanımları ekliyoruz.

      var config = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile<DomainToResponseProfile>();
        });

        IMapper mapper = config.CreateMapper();
        services.AddSingleton(mapper);

Burada daha önce oluşturduğumuz Profil classını mappera tanıtıp , mapperın Singleton olarak ayağa kalmasını sağlıyoruz.

Şimdi ise tüm ayarlamalarını yaptığımız Mapper’ı servisimiz içerisinde kullanma zamanı.

İlk önce Mapperı Const. da tanımlıyoruz.

Sıra geldi servisimizde mapperi kullanmaya.

En son olarak Swagger üzerinden yapılan tesin sonucu ise ;

{

“users”: [

{

“userName”: “burak”,

“name”: “burak”,

“surName”: “başaran”,

“email”: “asdsa@.com”,

“header”: {

“isSuccess”: true,

“responseCode”: “0001”,

“message”: “Success”

},

“dataInfo”: {

“totalCount”: 0

}

},

{

“userName”: “burak2”,

“name”: “bura2k”,

“surName”: “başaran2”,

“email”: “asdsa@.com”,

“header”: {

“isSuccess”: true,

“responseCode”: “0001”,

“message”: “Success”

},

“dataInfo”: {

“totalCount”: 0

}

}

],

“header”: {

“isSuccess”: true,

“responseCode”: “0001”,

“message”: “Success”

},

“dataInfo”: {

“totalCount”: 0

}

}

Kısaca mappera neden ihtiyaç duyarız ve Automapper’ı nasıl kullanırızı anlatmaya çalıştım. Bu arada Automapperı kullanmak basit olsada hayat kurtaran çok güzel özellikleri var. İncelemenizi tavsiye ederim.

Proje linki : https://github.com/aburakbasaran/Authentication

Automapper Dokumanı : https://docs.automapper.org/en/stable/Getting-started.html

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Post comment