如何用AutoMapper实现继承类与组合类之间的映射?
问题场景
业务层采用多层继承结构(结构无法修改),数据库层通过组合方式模拟对应层级,使用AutoMapper进行对象映射时,继承类与组合类的跨结构属性无法自动关联。示例代码如下:
业务层对象
// Business layer objects public class A : B { public int SomeValue { get; set; } } public abstract class B { public int OtherValue { get; set; } }
数据库层对象
// Database layer objects public class ADbo { public int SomeValue { get; set; } public BDbo Data { get; set; } } public class BDbo { public int OtherValue { get; set; } }
现有配置无法完成继承与组合的跨结构映射(注:原配置存在拼写错误CreatMap,正确应为CreateMap):
var config = new MapperConfiguration(cfg => { cfg.CreateMap<A, ADbo>().ReverseMap(); cfg.CreateMap<B, BDbo>().ReverseMap(); });
可行解决方案
AutoMapper支持这种跨结构映射,但需要显式配置成员映射规则,关联继承类的基类属性与组合类的嵌套对象属性:
完整映射配置
var config = new MapperConfiguration(cfg => { // 配置基类与嵌套对象的基础映射 cfg.CreateMap<B, BDbo>().ReverseMap(); // 配置 A → ADbo:将A的基类属性映射到ADbo的Data属性 cfg.CreateMap<A, ADbo>() .ForMember(dest => dest.Data, opt => opt.MapFrom(src => src)) // 反向映射 ADbo → A:从Data中提取基类属性值 .ReverseMap() .ForMember(dest => dest.OtherValue, opt => opt.MapFrom(src => src.Data.OtherValue)); });
配置说明
- 正向映射(A→ADbo):通过
MapFrom(src => src)将包含基类属性的A对象,复用已配置的B→BDbo规则映射到ADbo的Data属性。 - 反向映射(ADbo→A):显式指定A的
OtherValue属性从ADbo的Data.OtherValue取值,SomeValue会自动匹配同名属性。
验证示例
var mapper = config.CreateMapper(); // 正向映射测试 var a = new A { SomeValue = 1, OtherValue = 2 }; var aDbo = mapper.Map<ADbo>(a); // 结果:aDbo.SomeValue = 1,aDbo.Data.OtherValue = 2 // 反向映射测试 var aDbo2 = new ADbo { SomeValue = 3, Data = new BDbo { OtherValue = 4 } }; var a2 = mapper.Map<A>(aDbo2); // 结果:a2.SomeValue = 3,a2.OtherValue = 4
若存在更复杂的多层级结构,可按相同逻辑扩展:为每一层继承类与对应组合类配置成员映射,复用基础的基类↔嵌套对象映射规则即可。
内容的提问来源于stack exchange,提问作者Knight Steele
相关产品推荐
相关产品推荐

