在最新版本中使用Automapper静态API

本文关键字:Automapper 静态 API 最新版 新版本 | 更新日期: 2023-09-27 17:52:49

我已经将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());

在最新版本中使用Automapper静态API

实际上你的代码现在什么也没做。你必须像这样修改它:

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'属性。