使用 Automapper 2.0 映射内部对象的最佳方法是什么
使用此问题中的解决方案(Automapper 1.0)
创建自定义值解析器
?
public class DTOObject
{
// MainObject
public int Id { get; set; }
public string Name { get; set; }
// SubObject (TopObject)
public string TopText { get; set; }
public string TopFont { get; set; }
// SubObject (BottomObject)
public string BottomText { get; set; }
public string BottomFont { get; set; }
}
public class MainObject
{
public int Id { get; set; }
public string Name { get; set; }
public SubObject TopObject { get; set; }
public SubObject BottomObject { get; set; }
}
public class SubObject
{
public string SubPropText { get; set; }
public string SubPropFont { get; set; }
}
自定义值解析器
public class CustomResolver : ValueResolver<DTOObject, SubObject>
{
protected override SubObject ResolveCore(DTOObject source)
{
return Mapper.Map<DTOObject, SubObject>(source);
}
}
对我来说,可以只使用 MapFrom (没有 ResolveUsing ,这使您有机会将此映射与 IQueryable 扩展一起使用)。 所以你会在 Automapper 配置中得到以下内容:
Mapper.CreateMap<DTOObject, SubObject>()
.ForMember(dest => dest.SubPropText, opt => opt.MapFrom(x => x.BottomText))
.ForMember(dest => dest.SubPropFont, opt => opt.MapFrom(x => x.BottomFont));
Mapper.CreateMap<DTOObject, MainObject>()
.ForMember(dest => dest.TopPart, opt => opt.MapFrom(x => x))
.ForMember(dest => dest.BottomPart, opt => opt.MapFrom(x => x));
我最终为来自
MainObject
的 DTOObject
的任何子对象创建了自己的值解析器。
public class PartResolver<T> : ValueResolver<DTOObject, T>
{
protected override T ResolveCore(DTOObject source)
{
return Mapper.Map<T>(source);
}
}
然后在我的 Automapper 配置中创建从
DTOObject
到 SubObject
的映射,并使用 ValueResolver 将该对象映射到 MainObject
Mapper.CreateMap<DTOObject, SubObject>();
Mapper.CreateMap<DTOObject, MainObject>()
.ForMember(dest => dest.TopPart, opt => opt.ResolveUsing<PartResolver<SubObject>>())
.ForMember(dest => dest.BottomPart, opt => opt.ResolveUsing<PartResolver<SubObject>>());
ResolveUsing 不适用于最新版本的 AutoMapper。所以剩下的唯一选择就是使用 MapFrom。 (使用@ZedRoth解决方案)。