AutoMapper接口嵌套映射异常:如何实现接口间嵌套映射?
解决AutoMapper接口嵌套映射问题
问题核心是AutoMapper无法自动推断如何将IBO2接口映射到IDBO2接口(接口无法直接实例化),同时你的实体可能被ORM生成了Castle动态代理类,导致AutoMapper需要明确的映射规则。下面是两种可行的解决方式:
方式一:添加接口到接口的映射并指定目标实现类
直接配置IBO2到IDBO2的映射,告诉AutoMapper使用DB2作为目标实例:
var config = new MapperConfiguration(cfg => { cfg.CreateMap<IBO1, DB1>(); // 关键配置:将IBO2映射为DB2实例,赋值给IDBO2类型的属性 cfg.CreateMap<IBO2, IDBO2>().As<DB2>(); });
方式二:在父映射中显式配置嵌套成员
在IBO1到DB1的映射里,单独指定BO2成员的映射规则,明确目标类型:
var config = new MapperConfiguration(cfg => { cfg.CreateMap<IBO2, DB2>(); cfg.CreateMap<IBO1, DB1>() .ForMember(dest => dest.BO2, opt => { opt.MapFrom(src => src.BO2); // 当源对象不为空时,将IBO2映射为DB2实例 opt.ResolveUsing(src => src.BO2 != null ? Mapper.Map<DB2>(src.BO2) : null); }); });
原理说明
- AutoMapper默认不处理接口到接口的映射,因为它无法确定要实例化哪个具体实现类,必须通过
As<T>()或显式解析来指定目标类型。 - 错误中的
Castle.Proxies.ObjectProxy是ORM生成的动态代理类,本质上实现了对应的业务接口(IBO2),上述配置会让AutoMapper正确识别代理类并应用映射规则。
内容的提问来源于stack exchange,提问作者Felix Arnold
相关产品推荐
相关产品推荐

