给定以下实体模型:
public class Location
{
public int Id { get; set; }
public Coordinates Center { get; set; }
}
public class Coordinates
{
public double? Latitude { get; set; }
public double? Longitude { get; set; }
}
以及以下视图模型:
public class LocationModel
{
public int Id { get; set; }
public double? CenterLatitude { get; set; }
public double? CenterLongitude { get; set; }
}
LocationModel属性的命名使得从实体到模型的映射不需要自定义解析器。
然而,当从模型映射到实体时,需要以下自定义解析器:
CreateMap<LocationModel, Location>()
.ForMember(target => target.Center, opt => opt
.ResolveUsing(source => new Coordinates
{
Latitude = source.CenterLatitude,
Longitude = source.CenterLongitude
}))
为什么会这样?有没有一种更简单的方法可以让AutoMapper根据视图模型中的命名约定构造一个新的坐标值对象?
更新
为了回答第一个问题,实体到视图模型的映射没有什么特别之处:
CreateMap<Location, LocationModel>();
编辑
请参阅下面的评论。这个答案实际上是针对相反的映射。
你做错了什么。您正确地遵循了约定,因此映射应该可以在不需要任何解析器的情况下工作。
我刚试过这个测试,它通过了:
public class Location
{
public int Id { get; set; }
public Coordinates Center { get; set; }
}
public class Coordinates
{
public double? Latitude { get; set; }
public double? Longitude { get; set; }
}
public class LocationModel
{
public int Id { get; set; }
public double? CenterLatitude { get; set; }
public double? CenterLongitude { get; set; }
}
[Test]
public void LocationMapsToLocationModel()
{
Mapper.CreateMap<Location, LocationModel>();
var location = new Location
{
Id = 1,
Center = new Coordinates { Latitude = 1.11, Longitude = 2.22 }
};
var locationModel = Mapper.Map<LocationModel>(location);
Assert.AreEqual(2.22, locationModel.CenterLongitude);
}