自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

對象到對象映射-AutoMapper

開發(fā) 前端
通常,這是當一種類型看起來與另一種類型不一樣時,已經存在轉換函數,并且您希望從“松散”類型變?yōu)楦鼜姷念愋?,例如字符串的源類型到Int32的目標類型。

[[382776]]

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

 概述

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

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

官網地址:

http://automapper.org/

官方文檔:

https://docs.automapper.org/en/latest/

入門

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

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

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

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

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

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

或標記類型:

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

現(xiàn)在,您可以在運行時將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 

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

定制類型轉換器

有時,您需要完全控制從一種類型到另一種類型的轉換。通常,這是當一種類型看起來與另一種類型不一樣時,已經存在轉換函數,并且您希望從“松散”類型變?yōu)楦鼜姷念愋?,例如字符串的源類型到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的任何映射。要為這些類型創(chuàng)建映射,我們必須提供一個自定義類型轉換器,并且我們可以通過三種方式:

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

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

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

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

  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實現(xiàn)。

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

當然還有很多功能需要去實際項目中實現(xiàn)。

 

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

2021-05-31 06:28:35

AutoMapper對象映射器

2023-12-15 15:03:54

.NETAutoMapper對象映射工具

2024-05-17 08:59:02

.NET對象映射庫

2023-07-07 07:43:37

AutoMapper映射庫

2009-09-23 13:26:10

Hibernate對象

2012-05-10 09:44:39

MongoDBJava

2012-02-08 12:17:38

HibernateJava

2012-02-08 14:01:18

HibernateJava

2021-01-12 07:34:13

NetCore 映射器對象

2024-02-26 08:15:00

數據映代碼開發(fā)

2012-05-30 15:03:43

ibmdw

2020-07-09 07:43:13

JavaScript數據結構技術

2009-07-20 13:47:08

iBATIS.NET字

2020-07-28 08:00:03

存儲數據技術

2021-11-11 17:36:07

鴻蒙HarmonyOS應用

2024-04-24 08:32:55

.NET對象映射

2021-11-29 09:48:35

Redis 對象映射

2023-01-10 09:38:09

面向對象系統(tǒng)

2013-07-08 17:06:36

PHP開發(fā)從程序化到面向對象程序化

2020-06-05 14:30:03

CephCPU 線程
點贊
收藏

51CTO技術棧公眾號