最近我一直在做关于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