什麼是AutoMapper?
AutoMapper是一個簡單的小型庫,用於解決一個看似複雜的問題 - 擺脫將一個對象映射到另外一個對象的代碼。這種類型的代碼是至關沉悶和無聊的寫,因此爲何不發明一個工具來爲咱們作?html
咱們來看看在.netcore3.1中怎樣使用AutoMapper9.0。app
1 public class BasicProfile : Profile, IProfile 2 { 3 public BasicProfile() 4 { 5 CreateMap<TestDto, Test>(); 6 CreateMap<Test, TestDto>(); 7 } 8 }
Profile提供了一個命名的映射類,全部繼承自Profile類的子類都是一個映射集合。這裏我建立了一個BasicProfile繼承Profile類。
CreateMap建立映射規則。
IProfile建立影射類的約束,表示繼承自該接口的類爲映射集合。 ide
因爲AutoMapper9.0中取消了自動建立影射規則的方法這裏咱們須要本身寫一個:工具
1 public static class ServiceCollectionExtensions 2 { 3 /// <summary> 4 /// 自動建立映射 5 /// </summary> 6 /// <param name="services"></param> 7 public static void AddAutoMapper(this IServiceCollection services) 8 { 9 var allProfile = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll").Select(Assembly.LoadFrom) 10 .SelectMany(y => y.DefinedTypes) 11 .Where(p => p.GetInterfaces().Contains(typeof(IProfile))) 12 .ToArray(); 13 services.AddAutoMapper(allProfile); 14 } 15 }
添加到ConfigureServices:ui
1 public void ConfigureServices(IServiceCollection services) 2 { 3 //自動建立映射 4 services.AddAutoMapper(); 5 }
這樣AutoMapper就配置完成,但爲了方便調用,咱們繼續寫幾個擴展:this
1 public static class AutoMapperApplicationBuilderExtensions 2 { 3 private static IServiceProvider _serviceProvider; 4 public static void UseStateAutoMapper(this IApplicationBuilder applicationBuilder) 5 { 6 _serviceProvider = applicationBuilder.ApplicationServices; 7 } 8 9 public static TDestination Map<TDestination>(object source) 10 { 11 var mapper = _serviceProvider.GetRequiredService<IMapper>(); 12 return mapper.Map<TDestination>(source); 13 } 14 15 public static TDestination Map<TSource, TDestination>(TSource source) 16 { 17 var mapper = _serviceProvider.GetRequiredService<IMapper>(); 18 19 return mapper.Map<TSource, TDestination>(source); 20 } 21 22 public static TDestination MapTo<TSource, TDestination>(this TSource source) 23 { 24 var mapper = _serviceProvider.GetRequiredService<IMapper>(); 25 return mapper.Map<TSource, TDestination>(source); 26 } 27 28 public static TDestination MapTo<TDestination>(this object source) 29 { 30 var mapper = _serviceProvider.GetRequiredService<IMapper>(); 31 return mapper.Map<TDestination>(source); 32 } 33 34 public static List<TDestination> MapToList<TDestination>(this IEnumerable source) 35 { 36 var mapper = _serviceProvider.GetRequiredService<IMapper>(); 37 return mapper.Map<List<TDestination>>(source); 38 } 39 40 public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source) 41 { 42 var mapper = _serviceProvider.GetRequiredService<IMapper>(); 43 return mapper.Map<List<TDestination>>(source); 44 } 45 }
添加到Configure:spa
1 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 2 { 3 app.UseStateAutoMapper(); 4 }
使用:.net
1 public TestDto Get(string id) 2 { 3 var test = _testDomain.Get(id); 4 return test.MapTo<TestDto>(); 5 }
轉自:https://www.cnblogs.com/letnet/p/12205352.htmlcode