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

對(duì)象到對(duì)象映射-AutoMapper

開(kāi)發(fā) 前端
通常,這是當(dāng)一種類型看起來(lái)與另一種類型不一樣時(shí),已經(jīng)存在轉(zhuǎn)換函數(shù),并且您希望從“松散”類型變?yōu)楦鼜?qiáng)的類型,例如字符串的源類型到Int32的目標(biāo)類型。

[[382776]]

本文轉(zhuǎn)載自微信公眾號(hào)「UP技術(shù)控」,作者conan5566 。轉(zhuǎn)載本文請(qǐng)聯(lián)系UP技術(shù)控公眾號(hào)。  

 概述

AutoMapper 是一個(gè)對(duì)象-對(duì)象映射器,可以將一個(gè)對(duì)象映射到另一個(gè)對(duì)象。

用來(lái)解決一個(gè)看似復(fù)雜的問(wèn)題,這種類型的代碼編寫起來(lái)相當(dāng)枯燥乏味,

官網(wǎng)地址:

http://automapper.org/

官方文檔:

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

入門

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

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

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

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

您可以使用配置文件定義配置。然后,通過(guò)在啟動(dòng)時(shí)調(diào)用IServiceCollection擴(kuò)展方法AddAutoMapper,使AutoMapper知道這些概要文件在哪些程序集中定義:

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

或標(biāo)記類型:

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

現(xiàn)在,您可以在運(yùn)行時(shí)將AutoMapper注入服務(wù)/控制器中:

  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 

當(dāng)然還有很多可擴(kuò)展性,比如:

定制類型轉(zhuǎn)換器

有時(shí),您需要完全控制從一種類型到另一種類型的轉(zhuǎn)換。通常,這是當(dāng)一種類型看起來(lái)與另一種類型不一樣時(shí),已經(jīng)存在轉(zhuǎn)換函數(shù),并且您希望從“松散”類型變?yōu)楦鼜?qiáng)的類型,例如字符串的源類型到Int32的目標(biāo)類型。

例如,假設(shè)我們的源類型為:

  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會(huì)拋出異常(在映射時(shí)和配置檢查時(shí)),因?yàn)锳utoMapper不知道從字符串到int,DateTime或Type的任何映射。要為這些類型創(chuàng)建映射,我們必須提供一個(gè)自定義類型轉(zhuǎn)換器,并且我們可以通過(guò)三種方式:

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

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

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

并向AutoMapper提供一個(gè)自定義類型轉(zhuǎn)換器的實(shí)例,或者為類型提供AutoMapper將在運(yùn)行時(shí)實(shí)例化的類型。我們上面的源/目標(biāo)類型的映射配置將變?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.     } 

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

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

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

 

責(zé)任編輯:武曉燕 來(lái)源: UP技術(shù)控
相關(guān)推薦

2021-05-31 06:28:35

AutoMapper對(duì)象映射器

2023-12-15 15:03:54

.NETAutoMapper對(duì)象映射工具

2024-05-17 08:59:02

.NET對(duì)象映射庫(kù)

2023-07-07 07:43:37

AutoMapper映射庫(kù)

2009-09-23 13:26:10

Hibernate對(duì)象

2012-02-08 12:17:38

HibernateJava

2012-05-10 09:44:39

MongoDBJava

2012-02-08 14:01:18

HibernateJava

2021-01-12 07:34:13

NetCore 映射器對(duì)象

2024-02-26 08:15:00

數(shù)據(jù)映代碼開(kāi)發(fā)

2020-07-09 07:43:13

JavaScript數(shù)據(jù)結(jié)構(gòu)技術(shù)

2012-05-30 15:03:43

ibmdw

2009-07-20 13:47:08

iBATIS.NET字

2020-07-28 08:00:03

存儲(chǔ)數(shù)據(jù)技術(shù)

2024-04-24 08:32:55

.NET對(duì)象映射

2021-11-29 09:48:35

Redis 對(duì)象映射

2021-11-11 17:36:07

鴻蒙HarmonyOS應(yīng)用

2023-01-10 09:38:09

面向對(duì)象系統(tǒng)

2025-06-09 02:14:00

2013-07-08 17:06:36

PHP開(kāi)發(fā)從程序化到面向?qū)ο?/a>程序化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品www久久久 www.蜜桃av | 久久三区 | 成人av在线大片 | 久久久久免费观看 | 在线看片国产 | 免费看91 | 国产精品一区二区三级 | 国产伦一区二区三区四区 | 久久高清精品 | 日本不卡视频在线播放 | 久操福利| 国产精品99久久久久久动医院 | 久久久91精品国产一区二区三区 | 亚洲欧美在线观看 | 9porny九色视频自拍 | www.色综合 | 中文字幕在线观看 | 毛片网在线观看 | 亚洲一区高清 | 中文字幕亚洲视频 | 国产精品永久 | 伦理一区二区 | 色婷婷综合久久久中字幕精品久久 | 暖暖成人免费视频 | 99国产精品久久久久老师 | 午夜电影日韩 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 黄色毛片网站在线观看 | 91成人在线视频 | 亚洲视频免费在线观看 | 精品综合久久久 | 国产精品久久久久久吹潮 | 日韩一区二区三区在线观看 | 国产精品视频一二三区 | 久久99精品视频 | 午夜电影网站 | 成人毛片在线视频 | 欧美视频精品 | 成人h免费观看视频 | 久久久久高清 | 国产成人高清 |