1 回答
![?](http://img1.sycdn.imooc.com/533e4d510001c2ad02000200-100-100.jpg)
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 关注
- 85 浏览
添加回答
举报