[非專業翻譯] Mapster – 對象引用
[非專業翻譯] 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);