假设我有一个包含以下属性的类:
列出ListOfObjectA;
对象A的定义如下:
Class ObjectA:
Prop a
Prop b
ListOfObjectA(由API端点作为DTO返回)将在UI中呈现。
在某些情况下,列表中的特定ObjectA实例需要提供附加的支持信息(例如,另一个对象SubObjectA(复杂类型),这在列表中的其他项目中并不常见),即n + 1例。
我正在尝试了解返回此信息的最佳方法,而又不会在DTO上塞满不必要的信息。
一个选择是将SubObjectx包含在ObjectA类本身中-当它为null或为空时,不要费心渲染它。我们将以编程方式在需要的地方填充它。
第二个选项可能是向ObjectA类添加url属性-url可以为空,也可以指向端点以获取其他信息,然后可以呈现响应。
我个人对第一个选项的反对意见是ListOfObjectA中的每个对象将始终包含不相关的信息。我更喜欢第二个选项,因为它包含一个字符串(端点),即if具有从何处获取子对象的值。但这也意味着API的客户端现在将具有一些程序逻辑,可以在需要时触碰这些端点。
我想知道是否还有其他更好的方法?
请问一个问题,如果我对这种情况的解释不是很好。
答案 0 :(得分:1)
无论您是从请求正文中自动进行JSON的模型绑定,还是使用JsonConvert
之类的工具手动创建模型,DTO类都必须具有所有可能的属性。没有真正的方法可以根据是否存在某些特定基准,从同一组数据实例化不同类型的对象。就是说,您可以创建一个自定义模型绑定程序和一些自定义JSON解析器来潜在地完成工作,但是涉及大部分化妆品的工作量并不值得投资。
对于它的价值,这只是DTO类本身的问题。您可以利用JSON.NET中的诸如JsonIgnore
属性,NullValueHandling
和DefaultValueHandling
枚举之类的东西来隐藏实际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。但是,它也是非常
答案 1 :(得分:0)
您可以使用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
。试试这个:)