我已将Automapper
从4.2.1升级到5.0.0。我在WebApi2项目中使用静态API,我正在尝试使映射起作用,所以我尝试了this SO answer。
所以我将代码更改为以下内容:
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
。
然而,我得到例外:
Mapper未初始化。使用适当的配置调用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());
答案 0 :(得分:2)
实际上你的代码现在什么都不做。你必须改变它:
public static class AutoMapping
{
public static void Config()
{
Mapper.Initialize(cfg =>
{
cfg.CreateMissingTypeMaps = true;
cfg.CreateMap<MyModel, MyDto>().ReverseMap();
});
Mapper.AssertConfigurationIsValid();
}
}
UPD (在 EDIT1 之后):
尝试使用expression.TypeMap
代替Mapper.Configuration.FindTypeMapFor<TSource, TDestination>()
答案 1 :(得分:0)
也许这会有所帮助:
设置配置:
var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>());
然后应该进行映射:
var mapper = new Mapper(config);
OrderDto dto = mapper.Map<OrderDto>(order);
您还可以公开&#39;配置&#39;作为静态属性,并在您的项目中使用它。还可以创建一个静态的Mapper&#39;已配置的属性。然后你就可以使用那个静态的Mapper&#39;你项目中的财产。