我有这两个模型:
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。sitesettingsviewmodel . sitesettingsviewmodel。缺少类型映射配置或不支持映射。类型为"AutoMapper"的异常。AutoMapperMappingException'被抛出。
为什么我需要写代码:
Mapper.CreateMap<SiteSettings, SiteSettingsViewModel>();
对我来说,这看起来像我在写猴子代码。这是不需要的
为什么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>();
或者注册它们以注入到你的控制器中,或者任何你计划使用它们的地方。