最近我一直在做關於DTO的大量閱讀,從未使用過它們。我讀過的一篇文章談到了DTO應該如何不僅僅複製域模型對象,而是每個DTO應該適合正在執行的服務操作。如何驗證客戶端服務器應用程序的DTO
如果我決定使用DTO並且想知道下面是否可以接受,這讓我想到了驗證嗎?
public class Person {
public Guid Id {get; set;}
public string Name {get; set;}
public Address Address {get; set;}
}
public class Address {
public Guid Id {get; set;}
public string AddressLine1 {get;set;}
...
}
publuc class CreatePersonDTO {
private string _name;
private string _addressLine1;
public string Name {
get {
if (_name == null)
throw new Exception("Missing");
return _name;
}
set { _name = value; }
}
public string AddressLine1 {
get { return _addressLine1; }
set { _addressLine1 = value; }
}
}
所以,你通過任何JSON或XML傳遞你的數據,這是序列化對象CreatePersonDTO和映射這些值創建一個Person和Address對象時,如果人缺少名稱那麼它會拋出一個驗證例外。
由於DTO本身就是特定於服務操作的,所以在這裏進行驗證是好的還是打破了某種有關業務邏輯應該駐留的規則?
同意。你需要的最後一件事是你的DTO在WCF(或其他通信提供者)深處的數據序列化/反序列化層中拋出異常。另一個好處是通過保持DTO的僅數據,很可能你可以在兩個地方使用相同的代碼文件(比如說Silverlight和ASP.NET Web服務),這樣你可以保證,如果你添加/刪除/更改屬性,每個來源相應地更新。只要您在那裏進行驗證(甚至是日誌記錄),就很有可能它不適合不同的環境/平臺。 –
好吧,我可以看到這將是一個壞主意。有沒有一個乾淨的模式來驗證DTO的不涉及'if(String.IsNullOrEmpty(personDto)在我的控制器中間拋出新的異常...'? – David
@David您是否想要驗證DTO是否從您的服務以有效狀態返回? – Jay