如何使用automapper将深层对象转换为平面对象并返回?
例如:
Person
{
public string Name { get; set; }
public Address Address { get; set; }
}
Address
{
public string City { get; set; }
public string State { get; set; }
}
FlatObject
{
public string Name { get; set; }
public string City { get; set; }
public string State { get; set; }
}
答案 0 :(得分:5)
您可以通过两种方式实现这一目标:
定义两个映射,一个来自FlatObject --> Person
,另一个来自FlatObject --> Address
:
Mapper.CreateMap<FlatObject, Address>();
Mapper.CreateMap<FlatObject, Person>()
.ForMember(dest => dest.Address, opt => opt.MapFrom(src => src));
定义一个映射并在映射定义中创建Address
对象:
Mapper.CreateMap<FlatObject, Person>()
.ForMember(
dest => dest.Address,
opt => opt.MapFrom(
src => new Address { City = src.City, State = src.State }));
我个人会选择选项1.这样,如果向FlatObject
添加属性,则不必担心更新映射定义(如果使用选项#2,则可以这样做。)
但是,@Raphaël指出作者的链接是正确的,该链接质疑映射到域对象的有效性。
答案 1 :(得分:1)
从版本6.0.1开始,您可以使用ReverseMap方法,该方法用于创建不平坦的地图。
Mapper
.CreateMap<FlatObject, Person>()
.ReverseMap();
这会创建两个贴图,展平贴图用于创建反转贴图。
答案 2 :(得分:0)
嗯,AutoMapper可以用于“自动”扁平化,只需尊重命名约定,在你的情况下
FlatObject {
public string Name {get;set;}
public string AddressCity {get;set;}
public string AddressState {get;set;}
}
但是AFAIK,AutoMapper并没有做不爽。
请参阅图书馆作者的this。
他们是其他工具(具有其他类型的限制),例如ValueInjecter