AutoMapper 使用 ConvertUsing 自定義類型轉換,將包含串列成員的物件映射為一組串列
從朋友那兒聽到了用 AutoMapper 把串列成員物件攤平成一組串列的問題,發現了 ConvertUsing 的好用,這邊就紀錄一下。
事情是這樣的,首先有一個 Parent
類別,其中包含著兩個成員:Id
和串列的 Child
類別,而 Child
類別則只有一個成員 Val
,如下:
public class Parent
{
public int Id { get; set; }
public IEnumerable<Child> Children { get; set; }
}
public class Child
{
public double Val { get; set; }
}
另外還有一個 Target
類別,包含 Id
和 Val
兩個成員:
public class Target
{
public int Id { get; set; }
public double Val { get; set; }
}
現在的目標是:將一個有著 Child 串列的 Parent 映射成 Target 串列。
也就是說,假設我們的來源是這樣子:
var boo = new Parent
{
Id = 1,
Children = new List<Child>
{
new Child { Val = 1 },
new Child { Val = 2 },
}
};
希望可以變成這樣子:
var expect = new List<Target>
{
new Target { Id = 1, Val = 1 },
new Target { Id = 1, Val = 2 },
};
我之前遇到的時候,會直覺地將 Child 直接 Map 到 Target,再對 Target 做個 Foreach 來補上 Parent 的 Id。
這次和朋友討論時,提到了另一個角度:雖然這樣的做法相當直覺快速,但其實並不能保證後續維護的人使用這組 Mappings 時,都知道這裡要補資料;況且此處的對應關係的確是 Parent
到 List<Target>
,並非 Child
到 Target
而已,直覺上就怪怪的。若要解決這個問題,可能就要再包裝一層,把 Mapper 隔離出去做個轉換器之類的。
但想想又覺得 AutoMapper 不可能沒提供這個場景能使用的方法才對,最後餵狗發現 AutoMapper 確實有提供 ConvertUsing
來讓我們客製化轉換過程,這邊就紀錄一下。