获取购物车信息
来源: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就是用来处理这个过程的。
032020-08-01