AutoMapper 版本之间的差异?

AutoMapper differences between versions?

我正在使用 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: Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type For no matching constructor, add a no-arg ctor, add optional arguments, or map all of the constructor parameters =========== AAA -> BBB (Destination member list) AAA -> BBB (Destination member list)

Unmapped properties: b

问题:

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

您看到的不同是由于您自己的实现不同。

一开始是猜测,后来被OP证实,所以这里是:

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

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