當然是,不過我們可以問深入一些,為什麼專案中會出現大量的物件對映轉換?(以下對於非mvc專案也適用)
在現代的軟體開發中,專案的層級更加的細分,而不同層級之間對於物件的需求是有區別的,這就需要在不同層級間傳遞資料的時候,必須要轉換資料。
舉一些實際具體的例子:
在持久層(資料訪問層), 我們的user物件,可能是乙個包含user表中所有欄位的資料的物件,甚至包含了使用者的password資訊。而在介面層,我們只是需要顯示使用者的 name, email,不需要password這些額外的資訊,同時,它還需要使用者的考勤資訊,而這個資訊來自於另外一張表。
這個例子中,能夠發現不同層之間,我們對於資料物件的需求是不同的。
每個層都做了它們職責範圍內的事情:
持久層關注資料,所以只提供資料物件,它無需知道外層如何使用這些資料物件,也無法知道。
介面層關注資料的呈現,它只關注它要顯示的資料。
在實際開發中,如果你還可以直接在business層或者介面層直接使用持久層的物件,因為你認為這個關係不大,整個專案都是你自己控制的,雖然 dirty,但是quick. 作為乙個有些潔癖的程式設計師,我還是建議使用dto在不同層級之間傳遞資料。因為當你做更高層級開發的時候,比如開發web service,wcf,web api這些為系統外部提供介面的開發時候,你就回明白這些好的習慣和思維能夠幫助你更加好的設計這些外部介面。
先來看乙個簡單的例子,這個例子是定義order物件到orderdto物件之間的對映。(我們把order稱呼為源類,orderdto稱呼為目標類)
智慧型匹配
自定義匹配規則
//屬性匹配,匹配源類中workevent.date到eventdate測試我們開篇提到的問題中,說到介面顯示user的name, email, 還有使用者的考勤資訊,而這些資訊來自於2張不同的表。這就涉及到了多對一對映的問題,2個持久層物件需要對映到乙個介面顯示層的物件。.formember(dest => dest.eventdate, opt => opt.mapfrom(src => src.workevent.date))
.formember(dest => dest.somevalue, opt => opt.ignore())//忽略目標類中的屬性
.formember(dest => dest.totalamount, opt => opt.mapfrom(src => src.totalamount ?? 0))//複雜的匹配
.formember(dest => dest.orderdate, opt => opt.uservalue(datetime.now));固定值匹配
假設我們的持久層物件是這樣的:
public class user
public string namepublic class userviewmodelpublic string email
public string passworkd
public datetime birthday
}public class evaluation
public int score
}在asp.net mvc中,我的介面顯示層的viewmodel是這樣的
public string namepublic string email
public int score
}
var initialsource = sources[0];public actionresult index() 1.在不同層中定義profile,只定義本層中的型別對映// now map the remaining source objects
if (sources.count() > 1)
}private static void map(object destination, params object sources)
var destinationtype = destination.gettype();
foreach (var source in sources)
}private static t map(object source) where t : class
}
}2.建立提供靜態方法configure,一次載入所有層中profile定義}protected override void configure()
}
3.在global.cs檔案中執行
最後,在global.cs檔案中程式啟動前,呼叫該方法
MapStruct 對映工具
org.mapstruct mapstruct jdk8 1.3.0.final org.mapstruct mapstruct processor 1.3.0.final 2.1 建立實體entity data entity entitylisteners auditingentitylisten...
外網對映工具
ngrok是乙個反向 通過在公共的端點和本地執行的web伺服器之間建立乙個安全的通道。ngrok可捕獲和分析所有通道上的流量,便於後期分析和重放。簡單來說,利用 ngrok可以通過外網來訪問部署在本地伺服器的 它還提供乙個web管理頁來監控http通訊報文,方便程式設計師發現問題 開發除錯。另外ng...
物件關係對映
雙向一對一對映 class card 把關係的維護交給多方物件的屬性去維護關係 c 關係的擁有方負責關係的維護,在擁有方建立外來鍵。所以用到 joincolumn cascade 設定級聯關係,這種關係是遞迴呼叫 可以是 cascadetype.persist 級聯新建 cascadetype.re...