AutoMapper 如何进行值转换?Profile注入服务?

发布时间 2024-01-05 08:56:38作者: 韩泽瑞

最近在写项目的时候遇到了一个问题,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>());

这样就能够解决我们的问题了,希望能帮助需要的人!