AutoMapper

AutoMapper คือ component ที่ใช้ในการ map ข้อมูลระหว่าง object ต่างชนิดกัน โดยทำการแปลงข้อมูลจาก object ชนิดหนึ่ง ไปกำหนดค่าให้กับ object อีกชนิดหนึ่ง ซึ่งถ้า object ปลายทางตรงตามข้อกำหนดของ AutoMapper ก็ไม่จำเป็นต้อง config ค่าใดๆเลย

การแปลงข้อมูลจาก object ชนิดหนึ่งไปยัง object อีกชนิดหนึ่ง เกิดขึ้นได้บ่อยในการพัฒนา application โดยเฉพาะ application ที่อยู่ในลักษณะ multi tiers ที่ต้องมีการส่งผ่าน object ระหว่างกัน เช่น UI layer กับ Service layer หรือ Data access layer กับ Service layer

การใช้งาน AutoMapper

เมื่อต้องการแปลงข้อมูลจาก object ต้นทางไปยัง object ปลายทางอีกชนิดหนึ่ง ถ้า object ปลายทางมี property name ชื่อเดียวกับ object ต้นทาง AutoMapper จะทำการกำหนดค่าให้กับ property ของ object ปลายทางโดยอัตโนมัติ การกำหนดค่า config การแปลงข้อมูลระหว่าง object ทำได้โดยใช้ MapperConfiguration ซึ่งจะมีเพียงหนึ่งเดียว และสร้างขึ้นตอนเริ่ม application หรือ ใช้ Mapper.Initialize static method

//static method 
Mapper.Initialize(cfg => cfg.CreateMap<Person, PersonPoco>());

//instance method
var config = new MapperConfiguration(cfg => cfg.CreateMap<Person, PersonPoco>());

type ที่อยู่ทางซ้ายของ cfg.CreateMap<>() คือ type ต้นทาง ส่วนทางด้านขวาคือ type ปลายทาง ซึ่งเราจะทำการ mapping โดยใช้ static Mapper method หรือจะใช้ instance method ก็ได้

var mapper = config.CreateMapper();

//instance method
var mapper = new Mapper(config);
PersonPoco poco = mapper.Map<PersonPoco>(person);

//static method
PersonPoco poco = Mapper.Map<PersonPoco>(person);

ในกรณีที่เรามี object ที่มีโครงสร้างซับซ้อน ซึ่งการใช้งานในบางโอกาสที่ต้องการดูข้อมูลเพี่ยงบางส่วน เราสามารถใช้งาน AutoMapper mapping ข้อมูล มาสู่ object ที่มีโครงสร้างเรียบง่ายใช้งานได้สะดวก ตัวอย่างเช่น object Order ที่มีโครงสร้างค่อนข้างซับซ้อนด้านล่างนี้

public class Order
{
    public Customer Customer { get; set; }
    public OrderLineItem[] OrderLineItems()
    public decimal GetTotal()
    {
       return OrderLineItems.Sum(li => li.GetTotal());
    }
}

public class Product
{
    public decimal Price { get; set; }
    public string Name { get; set; }
}

public class OrderLineItem
{
    public Product Product { get; private set; }
    public int Quantity { get; private set;}
    public decimal GetTotal()
    {   
       return Quantity*Product.Price;
    }
}

public class Customer
{
     public string Name { get; set; }
}

ถ้าต้องการข้อมูลเพียงแค่ CustomerName และ Total เราสามารถนำ AutoMapper มาช่วย Mapping ข้อมูลได้ดังนี้

public class OrderPoco
{
    public string CustomerName { get; set; }
    public decimal Total { get; set; }
}

Mapper.Initialize(cfg => cfg.CreateMap<Order, OrderPoco>()); 
OrderPoco poco = Mapper.Map<Order, OrderPoco>(order); 

config mapping โดยใช้ static method ทำการ map Order กับ OrderPoco และทำการ mapping โดยเรียกใช้ medthod Map ซึ่งการทำงานเบื้องหลัง AutoMapper จะทำการจับคู่ OrderPoco.Total property กับ Order.GetTotal(), ในส่วนของ OrderPoco.CustomerName จะทำการจับคู่กับ Order.Customer.Name ซึ่งจะเห็นว่าถ้า property name ของ object ปลายทางของการ mapping มีความเหมาะสม ก็ไม่จำเป็นต้องทำการ config mapping สำหรับ property นั้นๆ

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