c# - 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
问题:
为什么我在第二种情况下看到异常?(虽然没有出现在第一种情况下)
解决方案
您看到的差异是由于您自己的实现方式不同造成的。
起初这是一个猜测,后来被 OP 证实,所以这里是:
没有使用控制台版本Mapper.AssertConfigurationIsValid();
导致无效配置失败,没有它,AutoMapper 默默地隐藏了失败。
此外,有人询问即使没有该Mapper.AssertConfigurationIsValid();
方法,在 NET Core 版本中 AutoMapper 也会失败。我的猜测是 AutoMapper 作者决定不隐藏配置失败并在新版本中实现它,所以当应用无效映射时它会失败。