我有这两个型号:
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号线不起作用?
答案 0 :(得分: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>();
或者注册它们以注入您的控制器,或者您打算使用它们的任何其他地方。希望有所帮助。