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

Обновить

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

CreateMap<Location, LocationModel>();

person danludwig    schedule 03.02.2012    source источник
comment
Можете ли вы включить сопоставление сущности с моделью?   -  person Davin Tryon    schedule 03.02.2012
comment
Я включил сопоставление объекта с моделью.   -  person danludwig    schedule 03.02.2012


Ответы (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);
}
person devuxer    schedule 03.02.2012
comment
да. Сопоставление сущности с моделью представления работает отлично. Дело обстоит иначе, мне нужен преобразователь: Mapper.CreateMap<LocationModel, Location>(). - person danludwig; 03.02.2012
comment
@olivehour, извините за это. В этом случае, да, я думаю, вам нужен специальный преобразователь. Насколько я знаю, AutoMapper не выполняет развертку, а только сглаживает. Возможно, вы захотите изучить ValueInjecter (обратите внимание на написание). - person devuxer; 03.02.2012
comment
Спасибо, никогда не слышал об этой библиотеке раньше. - person danludwig; 03.02.2012