禁用 AutoMapper 内置枚举映射器
Disable AutoMapper built-in enum mapper
是否可以在 AutoMapper 中禁用枚举的内置映射器,或者用一个总是抛出异常的映射器替换它?
我发现内置映射器非常不可靠,因为它会尽力将输入映射到您提供的任何枚举,这会增加在代码中引入难以追踪的错误的风险。
我宁愿它失败并出现一个异常告诉我我缺少一个 mapper/converter 而不是让它正常工作然后调用堆栈向下几步代码失败因为值是'就在当前上下文中。
从你写的内容我可以想到几个选项:
如果对象上有枚举属性,可以忽略它
明确地使用:
CreateMap<Foo, Bar>().ForMember(dest => dest.EnumProperty, opt => opt.Ignore());
如果您为要映射的属性创建映射并省略枚举属性,您可以使用:
CreateMap<Foo, Bar>().ForMember(...).ForAllOtherMembers(opt => opt.Ignore())
如果您想替换枚举类型之间的映射,您可以将其覆盖为:
Mapper.CreateMap<EnumSrc,EnumDst>().ConvertUsing(value => {
throw new Exception();
});
根据 Lucian 的评论,我在配置中添加了以下代码:
services.AddAutoMapper(config =>
{
var enumMapper = config.Mappers.Single(m => m is AutoMapper.Mappers.EnumToEnumMapper);
config.Mappers.Remove(enumMapper);
}, typeof(Startup));
这会删除默认的 EnumToEnum 映射器,并在未配置映射时给出异常。
是否可以在 AutoMapper 中禁用枚举的内置映射器,或者用一个总是抛出异常的映射器替换它?
我发现内置映射器非常不可靠,因为它会尽力将输入映射到您提供的任何枚举,这会增加在代码中引入难以追踪的错误的风险。
我宁愿它失败并出现一个异常告诉我我缺少一个 mapper/converter 而不是让它正常工作然后调用堆栈向下几步代码失败因为值是'就在当前上下文中。
从你写的内容我可以想到几个选项:
如果对象上有枚举属性,可以忽略它 明确地使用:
CreateMap<Foo, Bar>().ForMember(dest => dest.EnumProperty, opt => opt.Ignore());
如果您为要映射的属性创建映射并省略枚举属性,您可以使用:
CreateMap<Foo, Bar>().ForMember(...).ForAllOtherMembers(opt => opt.Ignore())
如果您想替换枚举类型之间的映射,您可以将其覆盖为:
Mapper.CreateMap<EnumSrc,EnumDst>().ConvertUsing(value => { throw new Exception(); });
根据 Lucian 的评论,我在配置中添加了以下代码:
services.AddAutoMapper(config =>
{
var enumMapper = config.Mappers.Single(m => m is AutoMapper.Mappers.EnumToEnumMapper);
config.Mappers.Remove(enumMapper);
}, typeof(Startup));
这会删除默认的 EnumToEnum 映射器,并在未配置映射时给出异常。