【问题标题】:Do I need to implement INotifyPropertyChanged when using DTO and WPF?使用 DTO 和 WPF 时是否需要实现 INotifyPropertyChanged?
【发布时间】:2011-08-26 13:13:57
【问题描述】:

我的问题很简单,并且已经在标题中提出。

这里是上下文:我有一个包含实体和存储库的域。查询的结果被映射到 DTO 并发送到 GUI。

GUI 是用 WPF 实现的,对于映射,我需要实现 INotifyPropertyChanged 的​​类。

我的第一个想法是让 DTO 实现此接口,因为我预见到要再次将我的 DTO 映射到实现 INotifyPropertyChanged 的​​项目中需要做很多工作。

这是一个好习惯吗?有没有我没见过的陷阱?这种情况的“官方”良好做法是什么?

【问题讨论】:

    标签: c# wpf dto


    【解决方案1】:

    DTO 应该是非常简单、轻量级的数据传输对象。正因为如此,除了他们的数据,我不会在他们身上实现任何东西。另外,我相信如果将类序列化到 WCF 服务器/从 WCF 服务器序列化,属性都需要是公共的,所以你不能让像 Id 这样的东西只读

    我将创建实现 INotifyPropertyChangedIDataErrorInfoModel 类,用于属性更改通知和验证,并让它们在构造函数中接受 DTO。使用 AutoMapper 之类的东西将使 DTO 映射到模型变得非常简单

    【讨论】:

    • +1。 DTO 仅用于传输数据。它永远不会改变。它用数据设置,然后在层之间移动。在它接受更新并执行 mot 的那一刻 - 它不再是 DTO。就像吃牛排的素食餐不再是素食餐。
    • 好吧,在服务器端,我使用实体。然后我将实体映射到 DTO,将其发送给客户端。在那里,客户端将 DTO 映射到模型对象(实现 INotifyPropertyChanged 和 IDataErrorInfo。这是您的意思吗?
    【解决方案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 走开!

    【讨论】:

      【解决方案3】:

      WPF 的最佳实践是使用 MVVM 模式(模型-视图-视图模型)。 在这种情况下,您的 DTO 就是模型。您不应该将模型直接传递给视图,而是将其包装到可以反过来实现通知机制的 ViewModel 中。 这样模型是纯数据,不需要担心什么在使用它。 此外,您可以使用几个框架来简化映射工作(例如Automapper)。

      【讨论】:

        猜你喜欢
        • 2011-10-22
        • 2012-05-04
        • 2010-10-04
        • 2013-06-03
        • 2023-04-02
        • 1970-01-01
        • 2020-07-25
        • 2022-08-02
        • 1970-01-01
        相关资源
        最近更新 更多