我的问题相当简单,已在标题中提出。
以下是上下文:我有一个包含实体和存储库的域。查询结果映射到DTO并发送到GUI。
GUI是用WPF实现的,对于映射,我需要实现INotifyPropertyChanged的类。
我的第一个想法是让DTO实现这个界面,因为我预见了很多工作要将我的DTO再次映射到实现INotifyPropertyChanged的项目。
这是一个好习惯吗?有没有陷阱我还没见过?这种情况的“官方”良好做法是什么?
答案 0 :(得分:10)
DTO应该是非常简单,轻量级的数据传输对象。因此,除了他们的数据之外,我不会在他们身上实现任何东西。另外,我相信如果将类序列化到WCF服务器或从WCF服务器序列化,那么属性需要全部公开,所以你不能像Id只读那样做
我会创建实现Model
和INotifyPropertyChanged
的{{1}}类,用于更改属性通知和验证目的,并让它们在构造函数中接受DTO。使用类似AutoMapper的东西会使DTO映射到模型非常简单
答案 1 :(得分:2)
即使它是DTO,也没有太多理由不实施INPC。
INPC在我能想到的每个.net impl中都是如此,所以你不会在连接的两端采取你可能想要避免的额外依赖(通常为什么要使用DTO)
使用NotifyPropertyWeaver,您只需很少的代码就可以完成。
仅仅因为您的DTO实现了该界面,我认为它不会使它成为DTO。
DTO的维基百科定义表明DTO中没有任何行为。您现在已经以PropertyChanged事件的形式添加了行为,但考虑到使用DTO的全部原因是针对远程对象(http://msdn.microsoft.com/en-us/library/ms978717.aspx)我是仍然相信它没关系。
Fowler声明DTO的目的是减少远程调用中的参数数量。 (http://martinfowler.com/eaaCatalog/dataTransferObject.html)这甚至没有说你不能添加行为。
INPC离开!
答案 2 :(得分:0)
WPF的最佳实践是使用MVVM模式(Model-View-ViewModel)。 在这种情况下,您的DTO是模型。您不应该将模型直接传递给View,而是将其包装到ViewModel中,ViewModel又可以实现通知机制。 这样,模型就是纯数据,不需要担心使用它的是什么。 此外,您可以使用几个框架来简化映射工作(例如Automapper)。