使用Mapper.Initialize()进行多次映射

时间:2018-01-22 09:11:48

标签: asp.net automapper

我在我的ASP.Net项目中使用AutoMapper V.6.1.1作为映射器。 在我进行如下配置之前:

 var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<A, B>();
            cfg.CreateMap<C, D>().ForMember(dest => dest.CityDesc, opt => opt.MapFrom(src => src.City));
        });
  var mapper = config.CreateMapper();
  var var1= mapper.Map<B>(request);
  var var2= mapper.Map<List<C>, List<D>>(result);

现在,我想使用Mapper.Initialize()重构代码。所以我用过:

 Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<A, B>();
            cfg.CreateMap<C, D>().ForMember(dest => dest.CityDesc, opt => opt.MapFrom(src => src.City));
        });
  var var1= Mapper.Map<B>(request);
  var var2= Mapper.Map<List<C>, List<D>>(result);

我遇到了运行时错误:

 Missing type map configuration or unsupported mapping. Mapping types:    A-> B

Mapper.Initialize中使用多个配置是否有任何问题?在Initialize()正文中有一个映射的情况下没有错误。我该如何修复错误?

2 个答案:

答案 0 :(得分:2)

也许您的项目中有多个Mapper.Initialize,而您的项目中不应该有多个Mapper.Initialize 否则它将成为覆盖并且您丢失了以前的映射配置由Mapper.Initialize设置。现在可以得到错误(Missing type map configuration or unsupported mapping.

我建议您使用AutoMapper.Profile。您可以以分组的形式扭曲您的映射配置(在单独的配置文件中),然后立即按Mapper.Initialize注册所有主题;)

看看这个例子:

public class AB_Profile : Profile {
    protected override void Configure() {
        CreateMap<A, B>();
     // CreateMap<A, B1>();
     // CreateMap<A, B2>();
    }
}

public class CD_Profile : Profile {
    protected override void Configure() {
        CreateMap<C, D>()
        .ForMember(dest => dest.CityDesc, opt => opt.MapFrom(src => src.City));
    }
}

然后使用上面的个人资料初始化Mapper:

Mapper.Initialize(cfg => {
    cfg.AddProfile<AB_Profile >();
    cfg.AddProfile<CD_Profile >();
});

答案 1 :(得分:1)

开始使用第5版,如其网站上所述...

public class OrganizationProfile : Profile
{
    public OrganizationProfile()
    {
        CreateMap<Foo, FooDto>();
        // Use CreateMap... Etc.. here (Profile methods are the same as configuration methods)
    }
}

// How it was done in 4.x - as of 5.0 this is obsolete:
// public class OrganizationProfile : Profile
// {
//     protected override void Configure()
//     {
//         CreateMap<Foo, FooDto>();
//     }
// }

See Doc

然后将映射初始化为...

Mapper.Initialize(cfg => {
    cfg.CreateMap<Foo, Bar>();
    cfg.AddProfile<OrganizationProfile>();
});