You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:22:12