成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊一下對象到對象映射之AutoMapper

開發 前端
AutoMapper 是一個對象-對象映射器,可以將一個對象映射到另一個對象。用來解決一個看似復雜的問題,這種類型的代碼編寫起來相當枯燥乏味.

 [[402479]]

本文轉載自微信公眾號「UP技術控」,作者conan5566。轉載本文請聯系UP技術控公眾號。

概述

AutoMapper 是一個對象-對象映射器,可以將一個對象映射到另一個對象。

用來解決一個看似復雜的問題,這種類型的代碼編寫起來相當枯燥乏味,

官網地址:http://automapper.org/

官方文檔:https://docs.automapper.org/en/latest/

入門

AutoMapper支持使用靜態服務位置構造“自定義值解析器”,“自定義類型轉換器”和“值轉換器”的功能:

  1. var configuration = new MapperConfiguration(cfg => 
  2.     cfg.ConstructServicesUsing(ObjectFactory.GetInstance); 
  3.  
  4.     cfg.CreateMap<Source, Destination>(); 
  5. }); 

或動態服務位置,用于基于實例的容器(包括子容器/嵌套容器):

  1. var mapper = new Mapper(configuration, childContainer.GetInstance); 
  2.  
  3. var dest = mapper.Map(new Source { Value = 15 }); 

您可以使用配置文件定義配置。然后,通過在啟動時調用IServiceCollection擴展方法AddAutoMapper,使AutoMapper知道這些概要文件在哪些程序集中定義:

  1. services.AddAutoMapper(profileAssembly1, profileAssembly2 /*, ...*/); 

或標記類型:

  1. services.AddAutoMapper(typeof(ProfileTypeFromAssembly1), typeof(ProfileTypeFromAssembly2) /*, ...*/); 

現在,您可以在運行時將AutoMapper注入服務/控制器中:

  1. public class EmployeesController { 
  2.   private readonly IMapper _mapper; 
  3.  
  4.   public EmployeesController(IMapper mapper) => _mapper = mapper; 
  5.  
  6.   // use _mapper.Map or _mapper.ProjectTo 

當然還有很多可擴展性,比如:

定制類型轉換器

有時,您需要完全控制從一種類型到另一種類型的轉換。通常,這是當一種類型看起來與另一種類型不一樣時,已經存在轉換函數,并且您希望從“松散”類型變為更強的類型,例如字符串的源類型到Int32的目標類型。

例如,假設我們的源類型為:

  1. public class Source 
  2.   public string Value1 { get; set; } 
  3.   public string Value2 { get; set; } 
  4.   public string Value3 { get; set; } 

但您想將其映射到:

  1. public class Destination 
  2.   public int Value1 { get; set; } 
  3.   public DateTime Value2 { get; set; } 
  4.   public Type Value3 { get; set; } 

如果我們嘗試按原樣映射這兩種類型,則AutoMapper會拋出異常(在映射時和配置檢查時),因為AutoMapper不知道從字符串到int,DateTime或Type的任何映射。要為這些類型創建映射,我們必須提供一個自定義類型轉換器,并且我們可以通過三種方式:

  1. void ConvertUsing(Func<TSource, TDestination> mappingFunction); 
  2. void ConvertUsing(ITypeConverter<TSource, TDestination> converter); 
  3. void ConvertUsing<TTypeConverter>() where TTypeConverter : ITypeConverter<TSource, TDestination>; 

第一個選項就是任何帶有源并返回目的地的函數(也有多個重載)。這適用于簡單的情況,但對于較大的情況則顯得笨拙。在更困難的情況下,我們可以創建一個自定義的ITypeConverter :

  1. public interface ITypeConverter<in TSource, TDestination> 
  2.   TDestination Convert(TSource source, TDestination destination, ResolutionContext context); 

并向AutoMapper提供一個自定義類型轉換器的實例,或者為類型提供AutoMapper將在運行時實例化的類型。我們上面的源/目標類型的映射配置將變為:

  1. public void Example() 
  2.     var configuration = new MapperConfiguration(cfg => { 
  3.       cfg.CreateMap<string, int>().ConvertUsing(s => Convert.ToInt32(s)); 
  4.       cfg.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter()); 
  5.       cfg.CreateMap<string, Type>().ConvertUsing<TypeTypeConverter>(); 
  6.       cfg.CreateMap<Source, Destination>(); 
  7.     }); 
  8.     configuration.AssertConfigurationIsValid(); 
  9.  
  10.     var source = new Source 
  11.     { 
  12.         Value1 = "5"
  13.         Value2 = "01/01/2000"
  14.         Value3 = "AutoMapperSamples.GlobalTypeConverters.GlobalTypeConverters+Destination" 
  15.     }; 
  16.  
  17.     Destination result = mapper.Map<Source, Destination>(source); 
  18.     result.Value3.ShouldEqual(typeof(Destination)); 
  19.  
  20. public class DateTimeTypeConverter : ITypeConverter<string, DateTime> 
  21.     public DateTime Convert(string source, DateTime destination, ResolutionContext context) 
  22.     { 
  23.         return System.Convert.ToDateTime(source); 
  24.     } 
  25.  
  26. public class TypeTypeConverter : ITypeConverter<string, Type> 
  27.     public Type Convert(string source, Type destination, ResolutionContext context) 
  28.     { 
  29.           return Assembly.GetExecutingAssembly().GetType(source); 
  30.     } 

在第一個映射中,從字符串到Int32,我們僅使用內置的Convert.ToInt32函數(作為方法組提供)。接下來的兩個使用自定義ITypeConverter實現。

自定義類型轉換器的真正強大之處在于,只要AutoMapper在任何映射類型上找到源/目標對,它們就可以使用。我們可以構建一組自定義類型轉換器,并在其上使用其他映射配置,而無需任何其他配置。在上面的示例中,我們不必再次指定string / int轉換。由于必須在類型成員級別配置自定義值解析器,因此自定義類型轉換器的作用域是全局的。

當然還有很多功能需要去實際項目中實現。

 

責任編輯:武曉燕 來源: UP技術控
相關推薦

2021-02-22 06:41:35

對象AutoMapper映射

2022-08-08 08:25:21

Javajar 文件

2021-04-21 14:19:52

javaignalHandle接口

2021-12-27 18:00:30

對象數組Java

2023-12-15 15:03:54

.NETAutoMapper對象映射工具

2024-05-17 08:59:02

.NET對象映射庫

2025-01-10 11:07:28

2018-07-03 08:48:48

對象存儲塊存儲

2021-04-27 07:52:18

SQLNULLOR

2022-02-08 08:31:52

const關鍵字C語言

2021-04-21 21:06:11

數據結構

2021-06-30 00:19:43

AOP動態代理

2021-03-10 00:02:01

Redis

2023-07-07 07:43:37

AutoMapper映射庫

2021-03-26 00:20:34

NFT區塊鏈數據庫

2024-01-10 08:08:25

Python空值校驗開發

2021-08-07 07:56:59

Node邏輯對象

2021-02-06 08:34:49

函數memoize文檔

2021-01-12 07:34:13

NetCore 映射器對象

2019-01-31 07:16:06

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 毛片在线免费 | 亚洲天堂精品久久 | 日韩在线免费电影 | 日韩精品一区二区三区中文字幕 | 中文字幕亚洲欧美 | 午夜影院 | 免费亚洲婷婷 | 亚洲国产精品一区二区三区 | 作爱视频免费看 | 成人久久久久 | 特一级毛片 | 久久久久久免费看 | 狠狠干天天干 | 91黄色免费看 | 日韩视频精品在线 | 亚洲一区二区免费 | 亚洲97| 日本久久久久久久久 | 1区2区3区视频 | 日韩一区二区免费视频 | 成人国产精品久久 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 国产精品二区三区在线观看 | 亚洲毛片一区二区 | 亚洲乱码一区二区三区在线观看 | 久久爱一区 | 国色天香综合网 | 美女激情av | 日本精品在线播放 | 99自拍视频| 午夜精品一区二区三区在线播放 | 精品视频一区二区在线观看 | 九九热精品视频 | 男人的天堂在线视频 | 久久国产精品亚洲 | 一级毛片视频 | 亚洲欧美一区在线 | 婷婷色在线 | 激情福利视频 | 国产婷婷色一区二区三区 | 欧美精品一区二区在线观看 |