簡體   English   中英

提供附加信息以及列表中的某些特定項目

[英]Supply additional information with some specific items in a list

假設我有一個包含如下屬性的類:

清單ListOfObjectA;

對象A定義如下:

Class ObjectA:
Prop a
Prop b

ListOfObjectA(由API端點作為DTO返回)將在UI中呈現。

在某些情況下,列表中的特定ObjectA實例需要提供附加的支持信息(例如,另一個對象SubObjectA(復雜類型),這對於列表中的其他項目並不常見),即n + 1。

我正在嘗試了解返回此信息的最佳方法,而不會用不必要的信息阻塞DTO。

一種選擇是將SubObjectx包含在ObjectA類本身中-當它為null或為空時,不要費心渲染它。 我們會以編程方式在需要的地方填充它...

第二種選擇是向ObjectA類添加url屬性-url可以為空,也可以指向端點以獲取其他信息,然后可以呈現響應。

我個人的第一個選擇是反對ListOfObjectA中的每個對象始終包含不相關的信息。 我更喜歡第二個選項,因為它包含一個字符串(端點),即是否具有從中獲取子對象的值。 但這也意味着API的客戶端現在將具有一些程序邏輯,可以在需要時命中這些端點。

我想知道是否還有其他更好的方法?

請問一個問題,如果我對這種情況的解釋不是很好。

無論您是從請求主體中進行JSON的自動模型綁定,還是使用JsonConvert類的JsonConvert手動創建模型,您的DTO類都必須具有所有可能的屬性。 沒有真正的方法可以根據是否存在某些特定基准,從同一組數據實例化不同類型的對象。 就是說,您可以創建一個自定義模型綁定程序和一些自定義JSON解析程序來潛在地完成工作,但是涉及大部分化妝品的工作量並不值得投資。

就其價值而言,這僅是DTO類本身的問題。 您可以利用JSON.NET中的諸如JsonIgnore屬性以及NullValueHandlingDefaultValueHandling枚舉之類的東西來隱藏實際JSON中的成員,如果這是您的主要關注點。 例如:

public class ObjectA:
{
    public string A { get; set; }
    public string B { get; set; }

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string C { get; set; }
}

然后,在序列化對象時,如果未設置C屬性,則將獲得JSON,如:

{
    "a" : "foo",
    "b" : "bar"
}

如果已設置,您將獲得:

{
    "a" : "foo",
    "b" : "bar",
    "c" : "baz"
}

除此之外,我想說,最好的選擇是在必要時請求其他數據的鏈接。 這實際上是一件非常REST的事情。 本質上是HATEOAS 但是,它也很健談 這將需要發出更多的請求,特別是如果您必須對多個項目執行該請求時。 本質上,這是應用於API的N + 1數據庫查詢問題。

您可以使用List<anonymous_objects>

    var DTO = new List
    {  
       new {City = "Chicago", Code = "114"},
       new {City="Washington"},
       new {City="London", Code = "2"}
   }

但是有一個小問題:您將需要使用反射從項目中獲取數據:

 var city = DTO[0].GetType().GetProperty(nameof(DTO[0].City)).GetValue(DTO[0]);

另外,我想(我沒有檢查)您可以使用List<dynamic> 都一樣,但是您將編寫new List<dynamic>並且不需要使用GetType和所有這些東西。 只需寫入DTO[0].City 嘗試這個 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM