包含標籤 AutoMapper 的文章

菜雞抓蟲:AutoMapper 出現奇怪的型別對應錯誤嗎?貼心的慣例式映射可能正在造訪你家

部門朋朋前陣子忙著把一卡車陳年專案升級到 .Net 8,原本吃著火鍋唱著歌、升級升得好好的,眼看三下五除二就要升級完畢,但就在這一片祥和安寧之中,突然有個專案升級後 API 就原地死去,只留下 AutoMapper 的錯誤訊息,兇案調查也就此開始……


俗話說得好:不看錯誤訊息的偵探不是好偵探。

讓我們先看看以下片段(為保護當事欄位,已做混淆處理):

---> AutoMapper.AutoMapperMappingException: Error mapping types.

Mapping types:
BooDataModel -> BooDto
NiceProject.Repositories.DataModel.BooDataModel -> NiceProject.Services.Dto.BooDto

Type Map configuration:
BooDataModel -> BooDto
NiceProject.Repositories.DataModel.BooDataModel -> NiceProject.Services.Dto.BooDto

Destination Member:
ProductOrder

---> AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping.

Mapping types:
OrderedEnumerable`1 -> Int32
System.Linq.OrderedEnumerable`1[[Product...]] -> System.Int32

對第一現場進行勘驗,發現幾個值得注意的點:

  • 來源類別並沒有 ProductOrder 這個欄位,但目標類別有
  • MapperConfiguration 並沒有明確要求 Ignore ProductOrder,但原本的版本運行得好好的,升級 .Net 後才出錯

現在我們已經收集了案發現場的線索,但我們還需要回答一個關鍵的問題:錯誤訊息中的 AutoMapper 在案發時究竟做了什麼?

……

閱讀全文


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 類別,包含 IdVal 兩個成員:

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 時,都知道這裡要補資料;況且此處的對應關係的確是 ParentList<Target>,並非 ChildTarget 而已,直覺上就怪怪的。若要解決這個問題,可能就要再包裝一層,把 Mapper 隔離出去做個轉換器之類的。

但想想又覺得 AutoMapper 不可能沒提供這個場景能使用的方法才對,最後餵狗發現 AutoMapper 確實有提供 ConvertUsing 來讓我們客製化轉換過程,這邊就紀錄一下。

……

閱讀全文


AutoMapper —— 類別轉換超省力

類別間的轉換幾乎是每個專案每個工程師都會碰到的動作,舉凡是分層架構每層之間的轉換,如 Dto 轉換成 ViewModel;或是接收到資料要塞進自定義的類別時也需要進行轉換。但在遠古時代,當我們要把一個類別的資料倒進另一個類別時,總免不了一番折騰

例如一個卡片對戰遊戲的資料庫,光是要先把卡片資料讀取出來就需要:

有些時候也會看見用 Foreach 然後逐一傳值的場景,或是各種差不多的變種情況。同樣的是,光是將一個簡單的卡片資訊轉換成 ViewModel,就花了一大段在做對映的處理。這個過程本身枯燥乏味又占空間,更可怕的是,如果有個陳年資料表,動不動就上百個欄位,那這個轉換過程的恐怖程度可想而知

幸好!天無絕人之路,這種時候就是本日的主角 —— AutoMapper 出場的時候了。

當 AutoMapper 一出手,轉換的過程瞬間就變成:

是不是精簡很多呢?接著就讓我們來看看怎麼開始使用吧!

……

閱讀全文


系列文

最近文章

最近動態

轉貼推薦

分類

友鏈

標籤

統計資訊

  • 文章總數:110
  • 累積字數:312765
  • 瀏覽次數:-
  • 本站訂閱:RSS (index.xml)

工商服務

    DDDTaiwan