我已经将Automapper
从4.2.1升级到5.0.0。我在WebApi2项目中使用静态API,我试图让映射工作,所以我试着遵循这个答案。
public static class AutoMapping
{
public static void Config()
{
Mapper.Initialize(main =>
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMissingTypeMaps = true;
cfg.CreateMap<MyModel, MyDto>().ReverseMap();
});
config.AssertConfigurationIsValid();
});
}
}
以上是从Global.asax
调用的。
但是,我得到exception:
映射器未初始化。使用适当的配置调用Initialize。
初始化Automapper
的正确方法是什么,我现在需要更改所有控制器进行映射吗?
EDIT1
首先,上面的代码必须是:Mapper.Initialize(cfg =>
{
cfg.CreateMissingTypeMaps = true;
cfg.CreateMap<MyModel, MyDto>().ReverseMap();
});
Mapper.Configuration.AssertConfigurationIsValid();
其次,问题可能出在下面的方法中,我用它来忽略缺失的属性:
public static IMappingExpression<TSource, TDestination> IgnoreUnmapped<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
var typeMap = Mapper.Configuration.FindTypeMapFor<TSource, TDestination>();
if (typeMap != null)
{
foreach (var unmappedPropertyName in typeMap.GetUnmappedPropertyNames())
{
expression.ForMember(unmappedPropertyName, opt => opt.Ignore());
}
}
return expression;
}
我假设是'Mapper。还没有配置Configuration',因为上面的方法是在配置映射的Initialize
中调用的。
是否有一个现有的方法在Automapper本身,我可以使用而不是上面的?
EDIT2
下面的语法可以工作吗?
cfg.CreateMap<MyModel, MyDto>().ReverseMap().ForAllMembers(opt => opt.Ignore());
实际上你的代码现在什么也没做。你必须像这样修改它:
public static class AutoMapping
{
public static void Config()
{
Mapper.Initialize(cfg =>
{
cfg.CreateMissingTypeMaps = true;
cfg.CreateMap<MyModel, MyDto>().ReverseMap();
});
Mapper.AssertConfigurationIsValid();
}
}
乌利希期刊指南 ( EDIT1 ):
尝试使用expression.TypeMap
代替Mapper.Configuration.FindTypeMapFor<TSource, TDestination>()
也许这有帮助:
设置配置:
var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>());
那么映射应该发生在哪里:
var mapper = new Mapper(config);
OrderDto dto = mapper.Map<OrderDto>(order);
你也可以将'config'公开为静态属性,并在你的项目中使用它。还有一种方法是创建一个静态的"Mapper"属性。然后你可以在你的项目中使用静态的'Mapper'属性。