[英]AutoMapper: What is the difference between ForMember() and ForPath()?
[英]AutoMapper: What is the difference between PreserveReferences and MaxDepth?
我有点困惑。 我找不到PreserveReferences
和MaxDepth
之间的区别。
假设我们有以下DTO和模型。
public class PersonEntity
{
public PersonEntity InnerPerson { get; set; }
}
public class PersonModel
{
public PersonModel InnerPerson { get; set; }
}
如文档中所写:
以前,AutoMapper可以通过跟踪已映射的内容来处理循环引用,并在每个映射上检查源/目标对象的本地哈希表,以查看该项目是否已被映射。 事实证明,这种跟踪非常昂贵,您需要使用PreserveReferences选择启用圆形地图。 或者,您可以配置MaxDepth。
我的映射:
cfg.CreateMap<PersonModel, PersonEntity>().MaxDepth(1);
cfg.CreateMap<PersonEntity, PersonModel>();
程序:
var personModel = new PersonModel();
personModel.InnerPerson = personModel;
var entity = Mapper.Map<PersonEntity>(personModel);
这就是我期望得到的:
那就是我真正得到的:
我可以将它们( PreserveReferences
和MaxDepth
)都用于解析循环引用,但是我看不出有什么区别。 什么时候应该在MaxDepth
方法中使用不同数量的深度? 那么,有人可以提供吗? 提前致谢。
MaxDepth
在运行时不考虑对象值。 在映射树的深度达到配置的值之后,它只是停止映射。
PreserveReferences
对ProjectTo
MaxDepth
, MaxDepth
。 如果使用Map
,以某种方式,您有一个可能会在堆栈中溢出的映射树,但是对象实例没有重复,那么PreserveReferences
将无济于事, MaxDepth
将会帮助MaxDepth
。
MaxDepth
是可预测的,它停止在硬编码值上, PreserveReferences
仅在复制对象实例时停止。
感谢@Lucian Bargaoanu的回答。 我只想添加一个简单的MaxDepth
示例。
我最近更改了我的DTO和模型。
public class SelfEntity
{
public string Id { get; set; }
public string Name { get; set; }
public int Number;
public SelfEntity InnerSelfEntity { get; set; }
}
public class SelfModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public int Number;
public SelfModel InnerSelfModel { get; set; }
}
映射:
cfg.CreateMap<SelfModel, SelfEntity>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(x => x.Id.ToString()))
.MaxDepth(3);
程序:
SelfModel firstSelfModel = new SelfModel();
SelfModel prev = firstSelfModel;
for (int i = 0; i < 100; i++)
{
SelfModel newModel = new SelfModel
{
Id = Guid.NewGuid(),
Name = "Test name" + i.ToString(),
Number = i
};
prev.InnerFirstSelf = newModel;
prev = newModel;
}
var entity = Mapper.Map<FirstSelfEntity>(firstSelfModel);
从3级深度开始,我们将为InnerSelfModel
获得null
。
PreserveReferences对ProjectTo无效,MaxDepth有用。 如果通过Map以某种方式,您有一个可能会溢出堆栈的映射树,但是对象实例没有重复,那么PreserveReferences将无济于事,MaxDepth会帮助您。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.