Ошибка Automapper при простом преобразовании без CreateMap - PullRequest
5 голосов
/ 21 апреля 2011

У меня есть 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 строка?

1 Ответ

1 голос
/ 21 апреля 2011

Одна из причин заключается в том, что это полезно для более сложных сценариев сопоставления, где вам нужно определить более специфические поведения. Например (от 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>();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...