[非專業翻譯] Mapster - 物件引用
系列介紹
[非專業翻譯] 是對沒有中文文件進行翻譯的系列部落格,文章由機翻和譯者自己理解構成,和原文相比有所有不同,但意思基本一致。
因個人能力有限,如有謬誤之處還請指正,多多包涵。
正文
本文將說明 Mapster 如何配置物件引用
防止迴圈引用
當對映型別存在迴圈引用時,會導致 Mapster 試圖遞迴對映迴圈引用並丟擲 stackoverflow 異常。
如果想要對映迴圈引用或保留引用(例如指向同一個物件的兩個屬性),可以使用 PreserveReference
方法並將引數設定為 true
來實現這個需求:
TypeAdapterConfig<TSource, TDestination>
.NewConfig()
.PreserveReference(true);
注意! Mapster 配置的是型別到型別,而不是每個層次結構,所以在使用時需要顯示配置所有型別.
注意!
PreserveReference
不支援對ProjectTo
EFIQueryable
的對映 !
對映深度 —— 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);