AutoMapper 配置验证 AssertConfigurationIsValid
作用
AssertConfigurationIsValid():校验映射配置,检查目标类(Destination)所有属性是否都完成映射。
如果目标存在没有映射的属性,直接抛出
AutoMapperConfigurationException异常,提前发现字段漏配问题,避免运行时出现属性为null的隐性bug。
场景
源类 Source 属性:SomeValue
目标类 Destination 属性:SomeValuefff(名字不一致,无法自动映射)
调用校验方法直接报错。
示例
using AutoMapper;
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Mapper.Initialize(cfg =>
{
// 默认 MemberList.Destination:校验目标类全部属性必须映射
cfg.CreateMap<Source, Destination>()
//方案1:对无法映射的字段使用 Ignore() 忽略,告诉AutoMapper这个字段不用映射
.ForMember(dest => dest.SomeValuefff, opt => opt.Ignore());
// ========= MemberList枚举选项 =========
// MemberList.Destination【默认】:校验目标类所有属性必须映射
// cfg.CreateMap<Source, Destination>(MemberList.Destination);
// MemberList.Source:校验源类所有属性,源每个属性都必须映射出去
// cfg.CreateMap<Source, Destination>(MemberList.Source);
// MemberList.None:完全跳过映射校验,不做检查(不推荐开发环境使用)
// cfg.CreateMap<Source2, Destination2>(MemberList.None);
});
//执行配置校验,开发环境必写,上线可以移除
Mapper.Configuration.AssertConfigurationIsValid();
Console.ReadKey();
}
}
//源类
public class Source
{
public int SomeValue { get; set; }
}
//目标类
public class Destination
{
public int SomeValuefff { get; set; }
}
}Code language: JavaScript (javascript)
三种解决校验报错的方式
.ForMember(...).Ignore()(最常用)
目标字段不需要赋值,显式忽略该字段,跳过校验检查。
.CreateMap<Source,Destination>()
.ForMember(d=>d.SomeValuefff, o=>o.Ignore());Code language: JavaScript (javascript)
- 手动MapFrom指定映射关系
字段需要赋值,手动绑定源字段,不再漏配。
.ForMember(d=>d.SomeValuefff,o=>o.MapFrom(s=>s.SomeValue));Code language: JavaScript (javascript)
- 修改MemberList,改变校验规则
MemberList.Destination默认:校验目标对象全部属性(最常用)MemberList.Source:校验源对象全部属性,源每个属性都要有映射输出MemberList.None:关闭校验,不检查配置(生产慎用,隐藏bug)
开发最佳实践
- 开发环境:必须调用
AssertConfigurationIsValid(),尽早暴露配置错误。 - 生产环境:可以注释掉,减少启动开销。
- 不要滥用
MemberList.None,会失去校验保护,漏写映射不会报错。
注意:AssertConfigurationIsValid 只检查映射配置,不会校验实际对象的数据。只是检查CreateMap配置是否完整。
Profile配置类写法
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Source, Destination>(MemberList.Destination)
.ForMember(d => d.SomeValuefff, opt => opt.Ignore());
}
}
//初始化
Mapper.Initialize(x => x.AddProfile<MappingProfile>());
Mapper.Configuration.AssertConfigurationIsValid();Code language: HTML, XML (xml)
Previous: 指定映射字段
Next: ReverseMap 反转映射