一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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
主站蜘蛛池模板: 91一个人的在线观看www | 精品日韩视频 | 交换年轻夫妇HD中文字幕 | 99国产精品热久久久久久夜夜嗨 | 俄罗斯极品h在线 | 大乳奶水bbw | 国产香蕉一区二区在线观看 | 天天色天天综合网 | 毛片手机在线视频免费观看 | 996热精品视频在线观看 | 色噜噜视频影院 | 四虎国产精品免费入口 | 欧美夜夜精品一级爽 | 91你懂的 | 国产精品视频在这里有精品 | 国产成人性色视频 | 99九九国产精品免费视频 | 奇米网7777 | 亚洲视频中文字幕 | 亚洲va欧美va天堂v国产综合 | 日本一本二本三区免费 | 精品成人片深夜 | 日韩在线毛片 | 日韩在线一区二区三区免费视频 | 日本视频免费在线 | 亚洲精品老司机福利在线播放 | 国产成人永久免费视 | 欧美午夜精品久久久久久黑人 | 日本肉体xxxx | dyav午夜片| 999久久免费高清热精品 | 国产欧美视频一区二区三区 | 日韩精品一二三区 | 欧美精品v日韩精品v国产精品 | 无人区1免费完整观看 | 天堂网www在线中文天堂 | 久久国产综合精品欧美 | 日韩欧美一区二区在线观看 | 日本xxxx在线视频免费 | 四虎影视在线观看永久地址 | 亚洲激情偷拍 |