配置验证

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)

三种解决校验报错的方式

  1. .ForMember(...).Ignore()(最常用)
    目标字段不需要赋值,显式忽略该字段,跳过校验检查。
.CreateMap<Source,Destination>()
.ForMember(d=>d.SomeValuefff, o=>o.Ignore());Code language: JavaScript (javascript)
  1. 手动MapFrom指定映射关系
    字段需要赋值,手动绑定源字段,不再漏配。
.ForMember(d=>d.SomeValuefff,o=>o.MapFrom(s=>s.SomeValue));Code language: JavaScript (javascript)
  1. 修改MemberList,改变校验规则
  • MemberList.Destination 默认:校验目标对象全部属性(最常用)
  • MemberList.Source:校验源对象全部属性,源每个属性都要有映射输出
  • MemberList.None:关闭校验,不检查配置(生产慎用,隐藏bug)

开发最佳实践

  1. 开发环境:必须调用 AssertConfigurationIsValid(),尽早暴露配置错误。
  2. 生产环境:可以注释掉,减少启动开销。
  3. 不要滥用 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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注