[非專業翻譯] Mapster – 對象引用

[非專業翻譯] 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);
Tags: