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



给定以下实体模型:

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

相关内容

  • 没有找到相关文章

最新更新