我在我的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()
正文中有一个映射的情况下没有错误。我该如何修复错误?
答案 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>();
// }
// }
然后将映射初始化为...
Mapper.Initialize(cfg => {
cfg.CreateMap<Foo, Bar>();
cfg.AddProfile<OrganizationProfile>();
});