获取购物车信息

来源:12-3 【应用】获得当前用户的购物车

Sea_Man

2020-07-31

GetShoppingCart函数的最后一行尝试了一下不映射为Dto,直接return Ok(shoppingCart),结果返回了500。图片描述
按道理映射为Dto只是为了将实际的数据模型与用户看到的信息隔离开,不映射也不会产生太大的问题。可是这里shoppingCart在转换为json的时候却产生了一种循环引用的错误。请问老师能否解答一下是什么原因?

代码和课程保持一致,只是把最后的return Ok(_mapper.Map<ShoppingCartDto>(shoppingCart));改为了return Ok(shoppingCart);

写回答

1回答

阿莱克斯刘

2020-07-31

是的,正如你所说,问题的原因就是在直接输出数据模型的时候会产生循环嵌套。举个例子,就是shoppingcart里有一个指向user的对象 而user内又有一个指回shoppingcart的引用,数据在输出json的时候就会如此反复、陷入无限循环,最后导致奔溃产生500错误。那为什么只有在输出json的时候才会崩溃呢?这就是因为c#中有一种机制叫做lazy load延迟加载,也就是说程序运行时先不提取数据,直到数据输出才执行数据提取,提取数据的时候发现有循环,这时候系统就崩了。因为这种崩溃情况只会发生在直接输出嵌套模型得情况下,所以规避方法其实也很简单,就是做data transfer数据变换(也就是dto),当进行数据变换的时候数据间原本的联系就会被切断、进行重组,于是嵌套循环的关系就不存在了。而我们课程中使用的映射工具automapper就是用来处理这个过程的。

0
3
阿莱克斯刘
这个问题。。。我也没法解释了?,只能认为是一对一和一对多的区别了。回头我也查查资料,看看能不能找到比较让人满意的答案。
2020-08-01
共3条回复

.Net 开发电商后端API 从0到精通RESTful

. Net 实战+RESTful思想纵深课程,开发优雅RESTful风格API。

977 学习 · 547 问题

查看课程