Ошибка Automapper при простом преобразовании без CreateMap

У меня есть эти 2 модели:

public class SiteSettingsViewModel
{
    public decimal SubscriptionFee { get; set; }
}

public class SiteSettings
{
    public decimal SubscriptionFee { get; set; }
}

и код:

var model = Mapper.Map<SiteSettings, SiteSettingsViewModel>(settingService.GetSettings());

Что выдает ошибку:

Попытка сопоставить WebApp1.Domain.Site.SiteSettings с WebApp1.WebUI.ViewModel.SiteSettingsViewModel. Отсутствует конфигурация сопоставления типов или неподдерживаемое сопоставление. Возникло исключение типа AutoMapper.AutoMapperMappingException.

Зачем мне ставить код:

Mapper.CreateMap<SiteSettings, SiteSettingsViewModel>();

Мне кажется, что я пишу обезьяний код. Это не нужно.

Почему не работает 1 строка?


person Shawn Mclean    schedule 20.04.2011    source источник


Ответы (1)


Одна из причин заключается в том, что это полезно для более сложных сценариев сопоставления, где вам нужно определить более конкретное поведение. Например (из CodePlex):

Mapper.CreateMap<CalendarEvent, CalendarEventForm>()
    .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.EventDate.Date))
    .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.EventDate.Hour))
    .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.EventDate.Minute));

Другой вариант простого сопоставления, подобного тому, что вы делаете, — это создать общий сопоставитель, который позаботится о вызове CreateMap для вас, например:

public interface IMapper<T1, T2>
{   
    T1 Map(T2 source);
}

public class Mapper<T1, T2> : IMapper<T1, T2> where T1 : class where T2 : class
{
    public Mapper()
    {
        Mapper.CreateMap<T2, T1>();
    }

    public T1 Map(T2 source)
    {
        return Mapper.Map<T2, T1>(source);
    }   
}

И затем вы можете просто создать их экземпляр напрямую, например:

var mapper = new Mapper<SiteSettings, SiteSettingsViewModel>();

Или зарегистрируйте их для внедрения в ваши контроллеры или везде, где вы планируете их использовать. Надеюсь, это поможет.

person ataddeini    schedule 20.04.2011
comment
Итак, почему мой код требует от меня использовать это? Я сопоставляю свойства с тем же именем и типом - person Shawn Mclean; 21.04.2011
comment
Насколько я понимаю, вам всегда нужно вызывать CreateMap, чтобы сопоставление было действительным, даже в простых сценариях. Вы можете создать универсальный картограф, который сделает это за вас, чтобы облегчить некоторые проблемы. Я обновлю свой ответ примером, чтобы показать вам, что я имею в виду. - person ataddeini; 21.04.2011