本文转载自微信公众号《UP科技控》,作者conan5566。转载本文请联系UP技控公众号。概述AutoMapper是一种对象-对象映射器,可将一个对象映射到另一个对象。用来解决一个看似复杂的问题,这类代码写起来相当枯燥,官网地址:http://automapper.org/官方文档:https://docs.automapper.org/en/latest/GettingStartedAutoMapper支持使用静态服务位置构造“自定义值解析器”、“自定义类型转换器”和“值转换器”的能力:varconfiguration=newMapperConfiguration(cfg=>{cfg.ConstructServicesUsing(ObjectFactory.GetInstance);cfg.CreateMap();});或基于实例的容器(包括子/嵌套容器)的动态服务位置:varmapper=newMapper(configuration,childContainer.GetInstance);vardest=mapper.Map(newSource{Value=15});您可以使用配置文件定义配置。然后,通过在启动时调用IServiceCollection扩展方法AddAutoMapper让AutoMapper知道这些配置文件是在哪些程序集中定义的:services.AddAutoMapper(profileAssembly1,profileAssembly2/*,...*/);或标记类型:services.AddAutoMapper(typeof(ProfileTypeFromAssembly1),typeof(ProfileTypeFromAssembly2)/*,...*/);现在你可以在运行时将AutoMapper注入到你的服务/控制器中:publicclassEmployeesController{privatereadonlyIMapper_mapper;publicEmployeesController(IMappermapper)=>_mapper=mapper;//use_mapper.Mapor_mapper.ProjectTo}当然还有很多可扩展性,例如:自定义类型转换器有时,您需要完全控制从一种类型到另一种类型的转换。通常这是当一种类型看起来不像另一种时,转换函数已经存在,并且您想从“松散”类型转换为更强的类型,例如String的源类型到Int32的目标类型。例如,假设我们的源类型是:publicclassSource{publicstringValue1{get;set;}publicstringValue2{get;set;}publicstringValue3{get;set;}}但你想将它映射到:publicclassDestination{publicintValue1{get;set;}publicDateTimeValue2{get;set;}publicTypeValue3{get;set;}}如果我们尝试按原样映射这两种类型,AutoMapper将抛出异常(在映射时和配置检查时),因为AutoMapper不知道从String到int、DateTime或Type的任何映射。要为这些类型创建映射,我们必须提供一个自定义类型转换器,我们可以通过三种方式实现:()whereTTypeConverter:ITypeConverter;第一个选项是任何接受源并返回目标的函数(也有多个重载)。这适用于简单的情况,但对于较大的情况会变得笨拙。在更困难的情况下,我们可以创建一个自定义ITypeConverterpublicinterfaceITypeConverter{TDestinationConvert(TSourcesource,TDestinationdestination,ResolutionContextcontext);}并为AutoMapper提供自定义类型转换器的实例,或者提供AutoMapper将实例化的类型运行。我们将上面的源/目标类型的映射设置更改为:publicvoidExample(){varconfiguration=newMapperConfiguration(cfg=>{cfg.CreateMap().ConvertUsing(s=>Convert.ToInt32(s));cfg.CreateMap().ConvertUsing(newDateTimeTypeConverter());cfg.CreateMap().ConvertUsing();cfg.CreateMap();});configuration.AssertConfigurationIsValid();varsource=newSource{Value1="5",Value2="01/01/2000",Value3="AutoMapperSamples.GlobalTypeConverters.GlobalTypeConverters+Destination"};Destinationresult=mapper.Map(源);result.Value3.ShouldEqual(typeof(Destination));}publicclassDateTimeTypeConverter:ITypeConverter{publicDateTimeConvert(stringsource,DateTimedestination,ResolutionContextcontext){returnSystem.Convert.ToDateTime(source);}}publicclassTypeTypeConverter:ITypeConverter{publicTypeConvert(字符串source,Typedestination,ResolutionContextcontext){returnAssembly.GetExecutingAssembly().GetType(source);}}在第一个映射中,从String到Int32,我们只是使用内置的Convert.ToInt32函数(作为方法组提供)Next的两个使用自定义ITypeConverter实现。自定义类型转换器的真正强大之处在于,只要AutoMapper在任何映射类型上找到源/目标对,就可以使用它们。我们可以构建一组自定义的类型转换器,并在其上使用额外的映射配置,而无需任何额外配置。在上面的示例中,我们不必再次指定string/int转换。由于自定义值解析器必须在类型成员级别配置,因此自定义类型转换器的范围是全局的。当然还有很多功能需要在实际项目中实现。