Github 開源:使用升訊威 Mapper( Sheng.Mapper)與 AutoMapper 互補,大幅提高開發效率!


 

Github 地址https://github.com/iccb1013/Sheng.Mapper

 

在上一篇幅中,簡單介紹了 升訊威 Mapper( Sheng.Mapper)【http://www.cnblogs.com/sheng_chao/p/7026732.html】,上文的介紹比較粗略,在這篇文章中,直接用幾個例子來具體的講一下它的使用場景,和為什么要使用它,以及和 AutoMapper 的互補使用。

 

AutoMapper 是一款十分強大的對象映射工具,我在項目中大量的使用了 AutoMapper 這一工具,如處理 DTO 與 實體對象間的映射關系,使用類似如下代碼:

 

但是在使用 AutoMapper 的過程中,有一些小細節會比較麻煩,它不能創建相同對象類型間的映射賦值關系,也不能根據場景為相同的對象映射關系創建不同的映射邏輯,所以我們目前的使用集中的 Dto 與 實體對象間的映射。

我們現在的項目使用了 Entity Framework ,在更新數據時,一般的邏輯是前端傳過來一個 DTO 對象,轉換成實體對象,根據 Id 去 DBContext 中拿到數據庫中的實體對象,再用傳入的實體對象給數據庫中的對象賦值,SaveChanges。

 

類似如下代碼,用傳入的 storehouseBase 給 dbStorehouseBase 賦值:

這里如果使用 AutoMapper   就涉及到兩個問題:

1.AutoMapper  是不能為相同的對象類型創建映射規則的,如:

 

2.如果不使用規則,即使可以直接 Map,實體對象中又存在大量的導航屬性,是不能直接覆蓋過去的,這就比較麻煩了,我們的項目中開發人員只好手工的用傳入的實體對象,一個屬性一個屬性為數據庫中拿到的實體對象賦值,如果要更新的屬性比較多,就非常麻煩,此外在修改時給實體對象新增加了屬性,是否還能保證記得回到這里來給添加新的賦值代碼。

 

所以在這種場景下, 可以使用 ShengMapper 來解決:

 

 

ShengMapper 的 SetValuesSkipVirtual 方法,見文知義,它自動映射兩個對象,進行賦值操作,並自動的跳過 Virtual  屬性,因為 Entity Framework 的導航屬性都是 Virtual   的(DB First)。

 

此外,還有一些更新賦值場景,存在一些特定的業務邏輯,比如說我更新用戶時,不更新 Password 字段,不更新最后登錄時間字段,更新訂單時,不更新創建時間字段等等,這種同一種對象類型的映射賦值,不但要跳過導航屬性,還要跳過指定的字段,也可以使用 ShengMapper  很好的解決,使用類似如下代碼:

 

它的方法原型是:

 

SetValuesWithoutProperties 方法 把 product 中的屬性,更新到 dbProduct 中,同時跳過 Supplier 屬性和所有的 Virtual 屬性。

 

那么既然能跳過指定的屬性,自然我們也能只更新指定的屬性,如:

SetValuesWithProperties 方法把 productEntryBatch 中的屬性值更新到 dbProductEntryBatch 中,但是只更新 Name 這個屬性。

 

ShengMapper 還提供了一些其它方法重載:

 

使用 ShengMapper 是不需要事先創建規則的,所有對對象的映射賦值操作,都是以更靈活的方式來完成的,比如我這一次 User 對 User 要排除 Password ,另一個場景不需要排除,也是可以的,而 AutoMapper 的規則必須是全局唯一的,一旦創建了 UserDTO 對 User 的規則,在所有的時候,都會遵循事先定義的規則去執行。

所以在實際應用中,可以通過與 AutoMapper 互補的方式,解決這方面的問題。

 

歡迎交流探討:QQ:279060597  @南京

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM