我是否需要在使用DTO和WPF时实现INotifyPropertyChanged
本文关键字:WPF 实现 INotifyPropertyChanged DTO 是否 | 更新日期: 2023-09-27 18:06:56
我的问题相当简单,已经在标题中提出了。
这里是上下文:我有一个包含实体和存储库的域。查询的结果被映射到DTO并发送到GUI。
GUI是用WPF实现的,对于映射,我需要实现INotifyPropertyChanged的类。
我的第一个想法是让DTO实现这个接口,因为我预见到很多工作要再次将我的DTO映射到实现INotifyPropertyChanged的项。
这是一个好的做法吗?有我没见过的陷阱吗?这种情况下的"官方"良好做法是什么?
dto应该是非常简单、轻量级的数据传输对象。因此,除了它们的数据之外,我不会对它们执行任何操作。此外,我认为如果将类序列化到WCF服务器,属性需要都是公共的,所以你不能让Id这样的东西只读
我将创建Model
类来实现INotifyPropertyChanged
和IDataErrorInfo
,用于属性更改通知和验证目的,并让它们在构造函数中接受DTO。使用像AutoMapper这样的东西将使DTO到模型的映射非常简单
即使它是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 !
使用WPF的最佳实践是使用MVVM模式(Model-View-ViewModel)。在本例中,DTO是Model。您不应该将模型直接传递给视图,而是将其包装到ViewModel中,该ViewModel可以反过来实现通知机制。这样,模型就是纯数据,不需要担心是什么在使用它。此外,还有几个框架可以用来简化映射工作(例如Automapper)。