没有CreateMap的简单转换的Automapper错误

Sha*_*ean 5 asp.net-mvc automapper

我有这两个型号:

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

public class SiteSettings
{
    public decimal SubscriptionFee { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和代码:

var model = Mapper.Map<SiteSettings, SiteSettingsViewModel>(settingService.GetSettings());
Run Code Online (Sandbox Code Playgroud)

这引发了以下错误:

尝试将WebApp1.Domain.Site.SiteSettings映射到WebApp1.WebUI.ViewModel.SiteSettingsViewModel.缺少类型映射配置或不支持的映射.抛出了"AutoMapper.AutoMapperMappingException"类型的异常.

为什么我需要输入代码:

Mapper.CreateMap<SiteSettings, SiteSettingsViewModel>();
Run Code Online (Sandbox Code Playgroud)

对我来说,这似乎是我在编写猴子代码.这不是必需的.

为什么1号线不起作用?

ata*_*ini 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));
Run Code Online (Sandbox Code Playgroud)

像您正在做的那样的简单映射的另一个选择是创建一个通用映射器来为您处理 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);
    }   
}
Run Code Online (Sandbox Code Playgroud)

然后你可以直接实例化它们,如下所示:

var mapper = new Mapper<SiteSettings, SiteSettingsViewModel>();
Run Code Online (Sandbox Code Playgroud)

或者将它们注册到您的控制器中,或者您计划使用它们的其他地方。希望有帮助。