詳解c AutoMapper 使用方式

2022-09-26 00:45:16 字數 3494 閱讀 3095

安裝方式:使用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的字段可以比實體中程式設計客棧的字段少,但是不能多。

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

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

那麼destmodel中對應的欄位名字可以是:subage,那麼automapper就可以自動為你賦值了,大家看最後的執行結果。

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

public class source1

public string geta

public string getd

public string setb

public string c

public subsource1 sub

} public class subsource1

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

public class dest1

public string a

public string c

public string subage

public string d

}我封裝的擴充套件方法:

///

/// 型別對映,預設欄位名字一一對應

///

/// 轉化之後的model,可以理解為viewmodel

/// 要被轉化的實體,entity

/// 可以使用這個擴充套件方法的型別,任何引用型別

/// 轉化之後的實體

public static tdestination mapto(this tsource source)

where tdestination:class

where tsource :class

使用方式:

var source1 = new source1

,c = "c",

geta = "a",

setb = "b"

};var destviewmodel = source1.mapto();

執行結果:

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

使用方法:不能再使用這個擴充套件方法了,只能自己額外寫**,**如下:

var config2 = new mapperconfiguration(

cfg => cfg.createmap()

.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轉化的擴充套件方法**貼上:

///

/// 集合列表型別對映,預設欄位名字一一對應

///

/// 轉化之後的model,可以理解為viewmodel

/// 要被轉化的實體,entity

/// 可以使用這個擴充套件方法的型別,任何引用型別

/// 轉化之後的實體列表

public static ienumerable maptolist(程式設計客棧this ienumerable source)

where tdestination : class

where tsource : class

同樣的使用方式:

var source1 = new source1

,c = "c",

geta = "a",

setb = "b"

};var source3 = new source1

,c = "c3",

geta = "a3",

setb = "b3"

};var sourcelist = new list ;

var destviewmodellist = sourcelist.maptolist();

執行結果:

以上就是我個人所得,希望對大家的學習有所幫助,也希望大家多多支援我們。

本文標題: 詳解c# automapper 使用方式

本文位址: /ruanjian/csharp/213067.html

Regmon使用詳解

新近安裝foxmail 5.0正式版,卻發現只能收取而不能傳送郵件。經過一番檢查確定,網路正常,foxmail設定也正確。那麼究竟是 何方神聖 在暗中搗鬼呢?甭急,咱先請來個 福爾摩斯 regmon幫忙查出 真兇 regmon v6.12小檔案 軟體版本 6.12 軟體大小 82 kb 軟體性質 免...

FCKeditor使用詳解

fckeditor 的.net 2.0核心庫 說明 fckeditor2.6.3.zip是其最新的檔案和什麼的 fckeditor.net.zip是asp.net呼叫的dll在裡面。2.分別解壓後把fckeditor2.6.3.zip裡的fckeditor目錄整個複製到 中。3.解壓fckedito...

c const使用詳解

關於c 中的const關鍵字的用法非常靈活,而使用const將大大改善程式的健壯性,現將本人的一些體會總結如下,期望對大家有所幫助 一 const基礎 如果const關鍵字不涉及到指標,我們很好理解,下面是涉及到指標的情況 int b 500 const int a b 1 int const a ...