AutoMapper กับขัอมูลชนิด Collection

การใช้งาน AutoMapper กับ object type array หรือ list ไม่จำเป็นต้องกำหนดค่า config การ map ของ array หรือ list เพียงแค่ config การ map ของ member ของ array หรือ list ที่ใช้งานเท่านั้น ตัวอย่างเช่น object ง่ายๆสองชนิดดังต่อไปนี้

public class Person
{
    public string name { get; set; }
}

public class Employee
{
   public string name { get; set; }
}

กำหนดค่า config ของ AutoMapper สำหรับการ map ข้อมูลจาก Person ไปยัง Employee

Mapper.Initialize(cfg => cfg.CreateMap<Person, Employee>());

var persons = new[]
{
   new Person  { Name = "A" },
   new Person  { Name = "B" },
   new Person  { Name = "C" }
};

AutoMapper สามารถใช้งานได้กับ generic collection type ดังนี้

  • IEnumerable
  • IEnumerable<T>
  • ICollection
  • ICollection<T>
  • IList
  • IList<T>
  • List<T>
  • Arrays

ในการทำ mapping ของ AutoMapper ถ้า collection ของ object ปลายทางที่ถูก map มี member อยู่แล้ว AutoMapper จะทำการ remove member ของ collection ปลายทางออกก่อน ที่จะทำการ mapping ข้อมูลจาก Object ต้นทาง

var enumEmployee = Mapper.Map<Person[], IEnumerable<Employee>>(persons);
var colEmployee = Mapper.Map<Person[], ICollection<Employee>>(persons);
var ilistEmployee = Mapper.Map<Person[], IList<Employee>>(persons);
var listEmployee = Mapper.Map<Person[], List<Employee>>(persons);
var arrayEmployee = Mapper.Map<Person[], Employee[]>(persons);

กรณีที่ collection ต้นทางที่ทำการ mapping มีค่าเป็น null, AutoMapper จะทำกำหนดค่าให้กับ collection ปลายทางเป็น empty collection ไม่ใช่ null collection เราสามารถเปลี่ยนค่า default โดยการกำหนดค่า AllowNullCollections = true ในตอน config mapper

Mapper.Initialize(cfg => {
    cfg.AllowNullCollections = true;
    cfg.CreateMap<Person, Employee>();
});

ในกรณีที่ collection ที่ต้องการ mapping มี member ที่มีลักษณะ hierarachy ก็สามารถใช้ AutoMapper ในการ mapping ข้อมูลได้เช่นกัน โดยกำหนด config ของ collection member โดยใช้ method Include หลังจาก config mapping ของ parent object แล้ว และเรียกใช้งาน Map ตามปกติ ดังนี้

public class ChildPerson : Person 
{
    public string JobName { get; set; }
}

public class ChildEmployee : Employee
{
   public string JobName { get; set; }
}


Mapper.Initialize(c=> 
{     c.CreateMap<Person, Employee>()        
          .Include<ChildPerson, ChildEmployee>();        
      c.CreateMap<ChildPerson, ChildEmployee>(); 
}); 

var persons = new[]
{
   new Person  { Name = "A" },
   new ChildPerson  { Name = "B" },
   new ChildPerson  { Name = "C" }
}; 

var enumEmployee = Mapper.Map<Person[], IEnumerable<Employee>>(persons);

อ้างอิง : http://docs.automapper.org/en/stable/Lists-and-arrays.html