Jos*_*man 5 c# circular-reference automapper
我有点困惑.我无法找出PreserveReferences和之间的区别MaxDepth.
假设我们有以下DTO和模型.
public class PersonEntity
{
public PersonEntity InnerPerson { get; set; }
}
public class PersonModel
{
public PersonModel InnerPerson { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如文档中所述:
以前,AutoMapper可以通过跟踪映射的内容来处理循环引用,并在每个映射上检查源/目标对象的本地哈希表,以查看该项是否已映射.事实证明,这种跟踪非常昂贵,您需要使用PreserveReferences选择使用圆形地图才能工作.或者,您可以配置MaxDepth.
我的映射:
cfg.CreateMap<PersonModel, PersonEntity>().MaxDepth(1);
cfg.CreateMap<PersonEntity, PersonModel>();
Run Code Online (Sandbox Code Playgroud)
程序:
var personModel = new PersonModel();
personModel.InnerPerson = personModel;
var entity = Mapper.Map<PersonEntity>(personModel);
Run Code Online (Sandbox Code Playgroud)
这就是我期望得到的:
这就是我实际得到的:
我可以使用它们(PreserveReferences和MaxDepth)来解析循环引用,但我没有看到区别.什么时候我应该在MaxDepth方法中使用不同的深度?那么,有人能提供吗?提前致谢.
MaxDepth在运行时不考虑对象值。它只是在映射树的深度达到配置值后停止映射。
PreserveReferences没有帮助ProjectTo,MaxDepth有。如果以某种方式,使用Map,您有一个可能溢出堆栈的映射树,但对象实例没有重复,那么PreserveReferences将无济于事,MaxDepth将。
MaxDepth是可预测的,它在硬编码值处PreserveReferences停止,仅在对象实例被复制时停止。