Mapster映射多实体:如何复用映射逻辑避免重复代码?
解决Mapster中继承DTO的映射逻辑复用问题
核心原因
Mapster默认不会自动继承父级DTO的映射配置,所以即使WorkshopWithTextDto继承自WorkshopDto,你还是得单独配置它与Workshop的映射规则——除非你手动指定继承关系。
最优解决方案:使用IncludeBase方法
Mapster提供了IncludeBase方法,专门用于让子类的映射配置继承父类的映射规则,这样你只需要在父类的配置里写一次公共逻辑,子类配置直接复用即可。
示例代码:
// 先配置父类的映射规则,只写一次公共逻辑 TypeAdapterConfig<Workshop, WorkshopDto>.NewConfig() .Map(dest => dest.Participants, src => src.WorkshopParticipants!.Count(x => x.Status == "attended")); // 子类配置直接继承父类的映射规则,无需重复写Participants的映射 TypeAdapterConfig<Workshop, WorkshopWithTextDto>.NewConfig() .IncludeBase<Workshop, WorkshopDto>();
这样WorkshopWithTextDto不仅会继承WorkshopDto的所有映射规则(包括Participants的统计逻辑),还会自动映射新增的Text字段(因为源对象Workshop也有同名属性,Mapster会自动匹配)。
其他复用方式:抽公共配置动作
如果你的场景里有更多类似的DTO,也可以把公共的映射逻辑抽成一个可复用的动作,然后应用到多个目标类型:
// 定义公共映射逻辑 void ConfigureWorkshopParticipants<TDto>(TypeAdapterConfig<Workshop, TDto> config) where TDto : WorkshopDto // 限定DTO必须继承自WorkshopDto { config.Map(dest => dest.Participants, src => src.WorkshopParticipants!.Count(x => x.Status == "attended")); } // 应用到父类DTO TypeAdapterConfig<Workshop, WorkshopDto>.NewConfig() .Apply(config => ConfigureWorkshopParticipants(config)); // 应用到子类DTO TypeAdapterConfig<Workshop, WorkshopWithTextDto>.NewConfig() .Apply(config => ConfigureWorkshopParticipants(config));
这种方式比直接复制代码更易维护,不过IncludeBase在继承场景下更简洁直接。
关于元组方案的说明
你提到的元组方案主要是针对源对象的多字段组合映射,不太适合你这种目标对象继承的场景,IncludeBase才是Mapster为继承映射提供的原生解决方案。
内容的提问来源于stack exchange,提问作者Mads
相关产品推荐
相关产品推荐

