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

时间:2016-06-28 10:03:35

标签: c# asp.net automapper

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

2 个答案:

答案 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;你项目中的财产。