【轉】AutoMapper對象映射

什麼是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

相關文章
相關標籤/搜索