国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - 詳解c# AutoMapper 使用方式

詳解c# AutoMapper 使用方式

2022-02-13 15:40大穩·楊 C#

本篇文章主要介紹了詳解c# AutoMapper 使用方式 ,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

安裝方式:使用vs自帶的nuget管理工具,搜索automapper ,選擇第一個安裝到你的項目即可。

先說說dto

dto是個什么東東?

dto(data transfer object)就是數據傳輸對象,說白了就是一個對象,只不過里邊全是數據而已。

為什么要用dto?

1、dto更注重數據,對領域對象進行合理封裝,從而不會將領域對象的行為過分暴露給表現層

2、dto是面向ui的需求而設計的,而領域模型是面向業務而設計的。因此dto更適合于和表現層的交互,通過dto我們實現了表現層與領域model之間的解耦,因此改動領域model不會影響ui層

3、dto說白了就是數據而已,不包含任何的業務邏輯,屬于瘦身型的對象,使用時可以根據不同的ui需求進行靈活的運用

我從網上找了一些資料,

automapper

現在我們既然知道了使用dto的好處,那么我們肯定也想馬上使用它,但是這里會牽扯一個問題:怎樣實現dto和領域model之間的轉換?

有兩個思路,我們要么自己寫轉換代碼,要么使用工具。不過就應用而言,我還是覺得用工具比較簡單快捷,那就使用工具吧。其實這樣的轉換工具很多,不過我還是決定使用automapper,因為它足夠輕量級,而且也非常流行,國外的大牛們都使用它。使用automapper可以很方便的實現dto和領域model之間的轉換,它是一個強大的object-object mapping工具。

下載了個demo,然后自己又寫了一遍,我把automapper 的使用分為兩種:

1、viewmodel與實體的字段名字是一致的,viewmodel的字段可以比實體中的字段少,但是不能多。

還有一種情況是:源實體中的字段名字是getxxx,那么viewmodel中對應的字段可以是xxx,也會自動對應賦值,比如我寫的demo中源實體中geta,viewmodel中的a;

再有一種情況就是實體中的實體賦值,在我寫的這個例子中,源實體中包含的實體類字段為sub,里面包含的字段名字為age,

那么destmodel中對應的字段名字可以是:subage,那么automapper就可以自動為你賦值了,大家看最后的運行結果。

給大家看下我建的源實體:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class source1
{
  public string name { set; get; }
 
  public string geta { set; get; }
  public string getd { set; get; }
 
 
  public string setb { set; get; }
 
  public string c { set; get; }
 
  public subsource1 sub { set; get; }
}
 
 
public class subsource1
{
  public string age { set; get; }
 
}

還有viewmodel(要轉化成為你想要的模型):

?
1
2
3
4
5
6
7
8
9
10
11
12
public class dest1
{
  public string name { set; get; }
 
  public string a { set; get; }
 
  public string c { set; get; }
 
  public string subage { set; get; }
 
  public string d { set; get; }
}

我封裝的擴展方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/// <summary>
/// 類型映射,默認字段名字一一對應
/// </summary>
/// <typeparam name="tdestination">轉化之后的model,可以理解為viewmodel</typeparam>
/// <typeparam name="tsource">要被轉化的實體,entity</typeparam>
/// <param name="source">可以使用這個擴展方法的類型,任何引用類型</param>
/// <returns>轉化之后的實體</returns>
public static tdestination mapto<tdestination, tsource>(this tsource source)
  where tdestination:class
  where tsource :class
{
  if (source == null) return default(tdestination);
  var config = new mapperconfiguration(cfg => cfg.createmap<tdestination, tsource>());
  var mapper = config.createmapper();
  return mapper.map<tdestination>(source);
}

使用方式:

?
1
2
3
4
5
6
7
8
9
10
var source1 = new source1
{
  name = "source",
  sub = new subsource1 { age = "25" },
  c = "c",
  geta = "a",
  setb = "b"
};
 
var destviewmodel = source1.mapto<dest1, source1>();

運行結果:

詳解c# AutoMapper 使用方式

2.viewmodel與實體字段名字沒有全部對應,只有幾個字段的名字和源實體中的字段名字是一樣的,其他的字段是通過實體中的幾個字段組合或者是格式或者是類型轉化而來的,

使用方法:不能再使用這個擴展方法了,只能自己額外寫代碼,代碼如下:

?
1
2
3
4
5
6
7
8
9
var config2 = new mapperconfiguration(
  cfg => cfg.createmap<sourceuser, destuser2>()
    .formember(d => d.destname, opt => opt.mapfrom(s => s.name))  //指定字段一一對應
    .formember(d => d.birthday, opt => opt.mapfrom(src => src.birthday.tostring("yy-mm-dd hh:mm")))//指定字段,并轉化指定的格式
    .formember(d => d.age, opt => opt.condition(src => src.age > 5))//條件賦值
    .formember(d => d.a1, opt => opt.ignore())//忽略該字段,不給該字段賦值
    .formember(d => d.a1, opt => opt.nullsubstitute("default value"))//如果源字段值為空,則賦值為 default value
    .formember(d => d.a1, opt => opt.mapfrom(src => src.name + src.age * 3 + src.birthday.tostring("d"))));//可以自己隨意組合賦值
var mapper2 = config2.createmapper();

注釋中都包含了平時常用的幾種情況,其他的我就沒有再寫。

下面再給大家把list轉化的擴展方法代碼貼上:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/// <summary>
/// 集合列表類型映射,默認字段名字一一對應
/// </summary>
/// <typeparam name="tdestination">轉化之后的model,可以理解為viewmodel</typeparam>
/// <typeparam name="tsource">要被轉化的實體,entity</typeparam>
/// <param name="source">可以使用這個擴展方法的類型,任何引用類型</param>
/// <returns>轉化之后的實體列表</returns>
public static ienumerable<tdestination> maptolist<tdestination, tsource>(this ienumerable<tsource> source)
  where tdestination : class
  where tsource : class
{
  if (source == null) return new list<tdestination>();
  var config = new mapperconfiguration(cfg => cfg.createmap<tdestination, tsource>());
  var mapper = config.createmapper();
  return mapper.map<list<tdestination>>(source);
}

同樣的使用方式:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        var source1 = new source1
        {
          name = "source",
          sub = new subsource1 { age = "25" },
          c = "c",
          geta = "a",
          setb = "b"
        };
var source3 = new source1
        {
          name = "source3",
          sub = new subsource1 { age = "253" },
          c = "c3",
          geta = "a3",
          setb = "b3"
        };
        var sourcelist = new list<source1> { source1, source3 };
        var destviewmodellist = sourcelist.maptolist<dest1, source1>();

運行結果:

詳解c# AutoMapper 使用方式

 以上就是我個人所得,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/dawenyang/p/7966850.html

延伸 · 閱讀

精彩推薦
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产精品伦理一区二区 | 久久一区 | 日韩精品一区二区三区四区 | 日韩成人免费在线 | 中文一区 | 国产精品成人3p一区二区三区 | 久久久一区二区 | 天堂免费在线 | 亚洲精品在线看 | 激情国产视频 | 国产成人网 | 国产黄色小视频在线观看 | 三区视频 | 国产精品久久久999 一区二区三区视频免费在线观看 | 久久中文字幕网 | 在线a视频| 国产精品日韩一区 | 99精品国产高清在线观看 | av国产精品| 国产精品国产精品国产专区不片 | 中文字幕视频一区 | 欧美国产日韩在线 | 亚洲欧美中文字幕 | 夜夜操比| 国产一区中文字幕 | 中文字幕综合在线 | 91在线公开视频 | 久久久99国产精品免费 | 一区在线视频 | 国产精品成人久久久久 | 黄色在线免费 | 中文字幕国产视频 | 高清一区在线 | 日韩亚洲视频 | 欧美精品亚洲 | 亚洲成人激情在线 | 成人午夜视频在线观看 | 国产精品久久久久久久久久久久久久 | 亚洲综合精品 | 天天爽夜夜爽夜夜爽精品视频 | 亚洲国产精品yw在线观看 |