在没有CreateMap的情况下进行简单转换时出现自动apper错误



我有这两个模型:

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>();

或者注册它们以注入到你的控制器中,或者任何你计划使用它们的地方。

相关内容

  • 没有找到相关文章

最新更新