为什么这里需要自定义解析器(AutoMapper)?

时间:2012-02-03 17:27:44

标签: automapper automapping automapper-2

给出以下实体模型:

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根据视图模型中的命名约定构造新的Coordinate值对象?

更新

要回答第一条评论,viewmodel映射的实体没有什么特别之处:

CreateMap<Location, LocationModel>();

1 个答案:

答案 0 :(得分:1)

修改

请参阅下面的评论帖子。这个答案实际上是针对相反的映射。


你做错了什么。您正确遵循惯例,因此映射应该无需任何解析器。

我刚试过这个测试,它通过了:

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);
}