[非專業翻譯] Mapster - 物件引用

玩雙截棍的熊貓發表於2021-07-08

[非專業翻譯] Mapster - 物件引用

系列介紹

[非專業翻譯] 是對沒有中文文件進行翻譯的系列部落格,文章由機翻和譯者自己理解構成,和原文相比有所有不同,但意思基本一致。

因個人能力有限,如有謬誤之處還請指正,多多包涵。

正文

本文將說明 Mapster 如何配置物件引用

防止迴圈引用

當對映型別存在迴圈引用時,會導致 Mapster 試圖遞迴對映迴圈引用並丟擲 stackoverflow 異常。

如果想要對映迴圈引用或保留引用(例如指向同一個物件的兩個屬性),可以使用 PreserveReference 方法並將引數設定為 true 來實現這個需求:

TypeAdapterConfig<TSource, TDestination>
    .NewConfig()
    .PreserveReference(true);

注意! Mapster 配置的是型別到型別,而不是每個層次結構,所以在使用時需要顯示配置所有型別.

注意!PreserveReference 不支援對 ProjectTo EF IQueryable 的對映 !

對映深度 —— MaxDepth

對於遞迴對映,可以嘗試使用 MaxDepth 方法指定對映深度,將在到達指定對映深度時停止對映。並且 MaxDepth 支援對 IQueryable 的對映。

TypeAdapterConfig<TSource, TDestination>
    .NewConfig()
    .MaxDepth(3);

注意!

  • MaxDepth 對映深度最小應該為 1,深度為1將對映物件本身成員,不繼續對映巢狀物件的成員。
  • MaxDepth 未限制最大深度,但不應該將深度設定太大,因為每增加一級深度就會生成一個對映邏輯,若深度過大會導致大量的記憶體佔用。

淺拷貝

Mapster 預設會遞迴對映巢狀物件。可以通過 ShallowCopyForSameType 方法將引數設定為true來進行淺拷貝:

TypeAdapterConfig<TSource, TDestination>
    .NewConfig()
    .ShallowCopyForSameType(true);

大物件對映

為了優化效能,Mapster 會嘗試內聯類對映。如果對映的模型很複雜,那麼這個過程將花費很多時間。

可以通過呼叫 AvoidInlineMapping 方法跳過內聯過程:

TypeAdapterConfig.GlobalSettings.Default
    .AvoidInlineMapping(true);

相關文章