首页 > 解决方案 > AutoMapper 版本之间的区别?

问题描述

我正在使用 AutoMapper 6.2.2 。

我有 2 节课:

public class BBB
{
    public int b { get; set; }
}


public class AAA
{
    public int a { get; set; }
}

请注意,它们具有不同的属性名称。

当我编写一个使用之间映射的简单控制台应用程序时AAA -> BBB,我没有遇到异常:

var a = new AAA();
var b = new BBB();

var config = new MapperConfiguration(cfg => cfg.CreateMap<AAA, BBB>());
var mapper = config.CreateMapper();
var dto = mapper.Map<BBB>(a);
Console.WriteLine(dto); //{b=0}

(没有例外)。

但是,如果我将 .Net Core 与:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddAutoMapper();
        Mapper.AssertConfigurationIsValid();
        services.AddControllers();
    }

然后在控制器中:

[HttpGet]
public object Get()
    {
        var a = new AAA();
        var t = _mapper.Map<AAA, BBB>(a);
        return t;
    }

然后,我确实看到了异常:

AutoMapper.AutoMapperConfigurationException:找到未映射的成员。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析器或修改源/目标类型对于没有匹配的构造函数,添加无参数 ctor、添加可选参数或映射所有构造函数参数 ======= ==== AAA -> BBB(目标成员列表) AAA -> BBB(目标成员列表)

未映射的属性:b

问题:

为什么我在第二种情况下看到异常?(虽然没有出现在第一种情况下

标签: c#automapper

解决方案


您看到的差异是由于您自己的实现方式不同造成的。

起初这是一个猜测,后来被 OP 证实,所以这里是:

没有使用控制台版本Mapper.AssertConfigurationIsValid();导致无效配置失败,没有它,AutoMapper 默默地隐藏了失败。

此外,有人询问即使没有该Mapper.AssertConfigurationIsValid();方法,在 NET Core 版本中 AutoMapper 也会失败。我的猜测是 AutoMapper 作者决定不隐藏配置失败并在新版本中实现它,所以当应用无效映射时它会失败。


推荐阅读