1 回答

TA貢獻1811條經驗 獲得超6個贊
對象圖中循環的存在很可能導致序列化出現故障。如果是這種情況,我很驚訝您在運行時沒有遇到異常。
AFAIK 你有兩個選擇:
裝飾類中您不想序列化的 props[JsonIgnore]或類似的 props,以避免對象圖中出現循環。
我認為這種方法的最大問題是它的不靈活性:考慮 2 個端點A、BFoo和一個具有多個屬性(包括x、y)的實體類;AFoo需要除x之外的所有道具,B需要除y之外的所有道具。如果類只有一種可能的序列化配置,您將如何處理這個問題Foo?
此外,從純粹主義者的角度來看,添加此類裝飾器會增加實體類的責任/知識,其中包含與業務邏輯無關的內容。
將實體映射到較低級別的對象(又稱 DTO)
另一種方法是將實體映射到(大部分)無行為類的實例中,這些類可以被視為數據傳輸對象。在大多數 Web/控制器層中,您將看到數據對象進出。例如,在您的情況下,您可以重構為以下內容:
public class NationalParkListData
{
? ? public string Id { get; set; }
? ? public Guid StateId { get; set; }
? ? public string Title { get; set; }
? ? public string Text { get; set; }
? ? // Depending on how rest-compliant your approach is, you?
? ? // might include non-collection nested objects or not
? ? public StateListData State { get; set; }
? ? public int NationalParkLinksCount { get; set; }
}
[HttpGet("/states/{stateId:guid}/national-parks")]
public async Task<IActionResult> GetNationalParksForState(Guid stateId, CancellationToken cancellationToken)
{
? ? var stateNationalParks = await _context.NationalParkList
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.Where(n => n.StateId == stateId)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.ToListAsync(cancellationToken);
? ? IEnumerable<NationalParkListData> result = // your mapper logic
? ? return this.Ok(result);
}
在這種情況下,您可以很容易地注意到,之前方法中提到的問題并不存在,因為它是由映射層處理的。為了實現映射層,最常見的方法是使用AutoMapper等庫。
- 1 回答
- 0 關注
- 114 瀏覽
添加回答
舉報