概述AutoMapper 是一個對象-對象映射器,可以將一個對象映射到另一個對象。 用來解決一個看似復雜的問題,這種類型的代碼編寫起來相當枯燥乏味, 官網(wǎng)地址: http:/// 官方文檔: https://docs./en/latest/ 入門AutoMapper支持使用靜態(tài)服務位置構(gòu)造“自定義值解析器”,“自定義類型轉(zhuǎn)換器”和“值轉(zhuǎn)換器”的功能: var configuration = new MapperConfiguration(cfg => { cfg.ConstructServicesUsing(ObjectFactory.GetInstance); cfg.CreateMap<Source, Destination>(); }); 或動態(tài)服務位置,用于基于實例的容器(包括子容器/嵌套容器): var mapper = new Mapper(configuration, childContainer.GetInstance); var dest = mapper.Map<Source, Destination>(new Source { Value = 15 }); 您可以使用配置文件定義配置。然后,通過在啟動時調(diào)用IServiceCollection擴展方法AddAutoMapper,使AutoMapper知道這些概要文件在哪些程序集中定義: services.AddAutoMapper(profileAssembly1, profileAssembly2 /*, ...*/); 或標記類型: services.AddAutoMapper(typeof(ProfileTypeFromAssembly1), typeof(ProfileTypeFromAssembly2) /*, ...*/); 現(xiàn)在,您可以在運行時將AutoMapper注入服務/控制器中: public class EmployeesController { private readonly IMapper _mapper; public EmployeesController(IMapper mapper) => _mapper = mapper; // use _mapper.Map or _mapper.ProjectTo } 當然還有很多可擴展性,比如: 定制類型轉(zhuǎn)換器有時,您需要完全控制從一種類型到另一種類型的轉(zhuǎn)換。通常,這是當一種類型看起來與另一種類型不一樣時,已經(jīng)存在轉(zhuǎn)換函數(shù),并且您希望從“松散”類型變?yōu)楦鼜姷念愋?,例如字符串的源類型到Int32的目標類型。 例如,假設我們的源類型為: public class Source { public string Value1 { get; set; } public string Value2 { get; set; } public string Value3 { get; set; } } 但您想將其映射到: public class Destination { public int Value1 { get; set; } public DateTime Value2 { get; set; } public Type Value3 { get; set; } } 如果我們嘗試按原樣映射這兩種類型,則AutoMapper會拋出異常(在映射時和配置檢查時),因為AutoMapper不知道從字符串到int,DateTime或Type的任何映射。要為這些類型創(chuàng)建映射,我們必須提供一個自定義類型轉(zhuǎn)換器,并且我們可以通過三種方式: void ConvertUsing(Func<TSource, TDestination> mappingFunction); void ConvertUsing(ITypeConverter<TSource, TDestination> converter); void ConvertUsing<TTypeConverter>() where TTypeConverter : ITypeConverter<TSource, TDestination>; 第一個選項就是任何帶有源并返回目的地的函數(shù)(也有多個重載)。這適用于簡單的情況,但對于較大的情況則顯得笨拙。在更困難的情況下,我們可以創(chuàng)建一個自定義的ITypeConverter <TSource,TDestination>: public interface ITypeConverter<in TSource, TDestination> { TDestination Convert(TSource source, TDestination destination, ResolutionContext context); } 并向AutoMapper提供一個自定義類型轉(zhuǎn)換器的實例,或者為類型提供AutoMapper將在運行時實例化的類型。我們上面的源/目標類型的映射配置將變?yōu)椋?/p> public void Example() { var configuration = new MapperConfiguration(cfg => { cfg.CreateMap<string, int>().ConvertUsing(s => Convert.ToInt32(s)); cfg.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter()); cfg.CreateMap<string, Type>().ConvertUsing<TypeTypeConverter>(); cfg.CreateMap<Source, Destination>(); }); configuration.AssertConfigurationIsValid(); var source = new Source { Value1 = "5", Value2 = "01/01/2000", Value3 = "AutoMapperSamples.GlobalTypeConverters.GlobalTypeConverters+Destination" }; Destination result = mapper.Map<Source, Destination>(source); result.Value3.ShouldEqual(typeof(Destination)); } public class DateTimeTypeConverter : ITypeConverter<string, DateTime> { public DateTime Convert(string source, DateTime destination, ResolutionContext context) { return System.Convert.ToDateTime(source); } } public class TypeTypeConverter : ITypeConverter<string, Type> { public Type Convert(string source, Type destination, ResolutionContext context) { return Assembly.GetExecutingAssembly().GetType(source); } } 在第一個映射中,從字符串到Int32,我們僅使用內(nèi)置的Convert.ToInt32函數(shù)(作為方法組提供)。接下來的兩個使用自定義ITypeConverter實現(xiàn)。 自定義類型轉(zhuǎn)換器的真正強大之處在于,只要AutoMapper在任何映射類型上找到源/目標對,它們就可以使用。我們可以構(gòu)建一組自定義類型轉(zhuǎn)換器,并在其上使用其他映射配置,而無需任何其他配置。在上面的示例中,我們不必再次指定string / int轉(zhuǎn)換。由于必須在類型成員級別配置自定義值解析器,因此自定義類型轉(zhuǎn)換器的作用域是全局的。 當然還有很多功能需要去實際項目中實現(xiàn)。 |
|