View Model 與 DTO 到底有何不同的時候,想用這篇文章解釋一下差異。
簡單來說View Model 是一個 POCO 物件,一個POCO 物件可以包含以下行為:
- 保留狀態(State)。
- 具有行為(資料驗證…)
最重要的就是具有行為,我們在做前端畫面時,很常透過Data Annotation 的方式,來驗證前端傳來的資料是否符合我們的定義,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class ViewModel
{
/// <summary>
/// UsrId 必填
/// </summary>
[Required]
public string UsrId { get; set; }
[EmailAddress(ErrorMessage = "您的Email 格式異常!")]
public string Email { get; set; }
/// <summary>
/// 申請日期
/// </summary>
private DateTime _applyDate;
public DateTime ApplyDate
{
get
{
//預設值帶今天
if (_applyDate == default(DateTime))
{
_applyDate = DateTime.Now;
}
return _applyDate;
}
set
{
_applyDate = value;
}
}
}
各位可以看到上面這個View Model ,UsrId 一定要必填、Email 格式一定要正確、申請日期預設帶今日,這些都是我們定義好的前端行為。
那DTO 又是什麼呢?
DTO(Data Trasfer Object)我認為翻成「資料乘載物件」較為合適,即這個物件只是一條船,這條船只負責幫我把貨物送到我們想要的地點,
但不會幫我們確認貨物是否違法、有無過期(因為這些工作是POCO 物件的工作)。
當然,有時我們沒有在View Model 做一些行為時,這時候View Model 就會跟 DTO 長得一模一樣,
這也是為何很多新人無法理解為何要將這兩樣東西區分開來(因為還要多維護好幾個檔案);
另外一個要區分的原因,是因為我們並不想把這些行為帶到商業邏輯層或是資料存取層來,
因為View 隨時都有可能變動,一變動我們一定會異動Model ,異動Model 近一步就會影響到我們的商業邏輯層跟資料存取層,這樣整個程式架構的耦合性就會變得很高!
另外一些分開的好處可以參考「[Asp .Net MVC] 淺談MVC系統架構」