究竟啥是“WPF 服务”?

Posted

技术标签:

【中文标题】究竟啥是“WPF 服务”?【英文标题】:What exactly are "WPF services"?究竟什么是“WPF 服务”? 【发布时间】:2009-05-29 08:41:25 【问题描述】:

有人在answer to a *** question 中告诉我,MVVM 模式的“两大把枪”是 1) 附加行为 和 2) 服务。我假设他的意思是“WPF 服务”,我发现它以下列方式使用:

PresentationFoundation.dll 定义 WPF 控件类型、动画和 多媒体支持,数据绑定 支持,以及其他 WPF 服务

其中许多 WPF 服务(解耦事件、丰富的数据绑定、 样式、资源等)是软件 开发最佳实践 融合在一个单一的声明式 UI 中 堆栈。

您将了解 WPF 背后的动机,学习 XAML 的语法, 检查核心编程模型,并调查几个 WPF 服务

我什至没有提到“WPF 服务”这样的 WPF 书籍,所以这只是一个表示“WPF 功能”的词,例如解耦事件、丰富的数据绑定、样式等。还是“WPF 服务”一词背后还有其他东西?

【问题讨论】:

是的,它是关于功能的。我会说在这种情况下,“服务”只是一个流行词,可以让它听起来更好。就像“用户体验”之类的。 【参考方案1】:

Martin Fowler 在他的Dependency Injection 文章中描述了服务是什么。简而言之,服务是提供其他对象使用的功能的对象。在讨论Inversion of Control 和Service Locator 模式时,您会发现该术语被大量使用。

为了具体说明当前的主题,让我们考虑一下如何在 MVVM 模式中显示消息框。调用 MessageBox.Show() 会很糟糕,Ray。这将 ViewModel 与 UI 架构紧密联系在一起,并使 ViewModel 难以测试。相反,一种解决方案是使用服务,我们将其称为 IDisplayMessage。该服务以某种方式(通过上述两种模式之一)提供给 ViewModel,并且该服务用于“显示”消息。在正常操作期间,此服务的具体版本将调用 MessageBox.Show(),但在测试期间,我们可以提供不同的具体版本(测试替身),其行为不同(通常是 noop,或者如果我们确保 ViewModel 显示消息,一个记录调用的版本,以便我们可以断言它发生了)。 Onyx(免责声明:我是作者)提供了这样的服务,以及为您的 ViewModel 提供此服务(和其他服务)所需的基础设施。

更新:自从做出此回应后,我写了一篇博文Services: Your ViewModel Deathstar,它很好地涵盖了这个主题。这是“系列”帖子的一部分,读者也可能对第一篇帖子感兴趣Behavior - Your Trusty ViewModel Bazooka。

【讨论】:

为什么不指向您的文章?附加行为:wekempf.spaces.live.com/Blog/cns!D18C3EC06EA971CF!940.entry 服务:wekempf.spaces.live.com/Blog/cns!D18C3EC06EA971CF!951.entry 当时文章还不存在,只是没想到回来更新回复。【参考方案2】:

他说的不是 WPF 服务,而是应用程序服务。也就是说,将部分功能抽象为多个 VM 可以使用的独立服务。

【讨论】:

这到底是什么意思,你说的是Windows服务还是Web服务?关于 WPF 的***文章给出了“WPF 应用程序服务”的示例,例如“用户界面、2D 和 3D 绘图、固定和自适应文档、高级排版、矢量图形、光栅图形、动画、数据绑定、音频和视频”。那意味着什么? “多个 ViewModel 可以使用数据绑定”。总是这样。从这个意义上说,“WPF 服务”和“应用程序服务”这个词的背后是什么?还是您指的是经典意义上的“安全服务”? “服务”是指对某项功能的抽象。也许底层功能是一个 COM 组件,或数据库访问或其他任何东西。没关系 - 虚拟机只知道它可以用来与所述功能交互的接口。

以上是关于究竟啥是“WPF 服务”?的主要内容,如果未能解决你的问题,请参考以下文章

究竟啥是“特级”?

究竟啥是“执着无知”?

究竟啥是绑定?

究竟啥是 JavaBean?

究竟啥是“样本”?

究竟啥是现场注入以及如何避免它?