Почему здесь нужен собственный распознаватель (AutoMapper)? - PullRequest
1 голос
/ 03 февраля 2012

Учитывая следующую модель сущности:

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 создавать новый объект значения Coordinates на основе соглашений об именах в модели представления?

Обновление

Чтобы ответить на первый комментарий, нет ничего особенного в сопоставлении сущности с моделью представления:

CreateMap<Location, LocationModel>();

1 Ответ

1 голос
/ 03 февраля 2012

Редактировать

Пожалуйста, смотрите ветку комментариев ниже. Этот ответ фактически для противоположного отображения.


Вы делаете что-то еще не так. Вы правильно соблюдаете соглашение, поэтому сопоставление должно работать без распознавателя.

Я только что попробовал этот тест, и он прошел:

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