最近在写项目的时候遇到了一个问题,dto中某个字段需要根据entity中某些字段进行一些计算而来。举个栗子
class dtoA { public string A{get;set;} } class entityA { public string A{get;set;} }
dtoA 和entityA 相互映射,我们需要根据实体A中的值和我们配置的某个项做比较,得到一个值给dtoA。我们知道在.netCore中,大多配置都是注入获得。刚开始
我是想把设置Ioption注入到指定 profile中,在网上也找到相关资料(地址如下如何在AutoMapper配置文件类中注入服务?-腾讯云开发者社区-腾讯云 (tencent.com)) 不过,并没有解决问题。 后来发现了 automapper Custom Value Resolvers ,类似于 WPF中的值转换器。官方地址如下:Custom Value Resolvers — AutoMapper documentation
那到底怎么使用了?
1创建转换器,需要继承 IValueResolver
public class EntityResolver : IValueResolver<entityA, dtoA, string> { ///注入配置 public LocationResolver(IOptionsMonitor<Settings> setting) { this.setting = setting; } public IOptionsMonitor<Settings> setting { get; } public LocationStorageEnum Resolve(entityA source, dtoA destination, string destMember, ResolutionContext context) { return setting.CurrentValue.xxx== source.A?"一样的": "不一样"; } }
这时候转换器已经完成,接下来我们需要使用这个转换器。
2、将转换器配置到profile中
///automapper 配置 使用转换器 CreateMap<entityA, dtoA>() .ForMember(dto => dto.A,express=>express.MapFrom<EntityResolver>());
这样就能够解决我们的问题了,希望能帮助需要的人!