AutoMapper升级后映射接口报错,求测试环境适配方案
AutoMapper版本升级后的接口映射问题解决
为什么v7.0.1能正常工作?
AutoMapper 7.x版本存在隐式行为:当配置从源类型映射到接口时,它会自动在当前程序集中扫描该接口的第一个实现类,将其作为默认实例化的类型。你的场景里,生产环境会自动匹配ProductionTarget,单元测试环境会匹配MockedTarget,所以当时能正常运行。但这种隐式逻辑存在不确定性(比如程序集加载顺序变化可能导致选到错误的实现类),因此后续版本移除了该行为,要求必须显式指定接口对应的实现类型。
当前版本(13.0.1)的实现方案
1. 生产环境配置
在映射配置中通过.As<T>()显式指定接口的生产实现类:
CreateMap<ISource, ITargetInterface>() .As<ProductionTarget>() // 指定生产环境的实现类 .ForMember(dest => dest.TargetProperty, opt => opt.MapFrom(src => src.SourceProperty));
2. 单元测试环境配置
单元测试需要单独构建AutoMapper配置,指定使用Mock实现类,避免和生产配置冲突:
// 测试类中的配置代码 var mapperConfig = new MapperConfiguration(cfg => { cfg.CreateMap<ISource, ITargetInterface>() .As<MockedTarget>() // 指定测试用的Mock实现类 .ForMember(dest => dest.TargetProperty, opt => opt.MapFrom(src => src.SourceProperty)); }); var mapper = mapperConfig.CreateMapper(); // 测试逻辑 var source = new SourceImplementation(); // 你的ISource实现类实例 var target = mapper.Map<ITargetInterface>(source); Assert.IsInstanceOf<MockedTarget>(target); // 验证映射字段是否符合预期
3. 映射时直接指定目标类型
如果不想修改全局配置,也可以在映射调用时直接指定具体的实现类,再转成接口:
// 生产环境 var targetObject = mapper.Map<ISource, ProductionTarget>(sourceObject) as ITargetInterface; // 单元测试环境 var targetObject = mapper.Map<ISource, MockedTarget>(sourceObject) as ITargetInterface;
内容的提问来源于stack exchange,提问作者jholzer
相关产品推荐
相关产品推荐

