【问题标题】:How do I choose between WCF, REST, POX and RIA services for a new Silverlight application如何为新的 Silverlight 应用程序在 WCF、REST、POX 和 RIA 服务之间进行选择
【发布时间】:2010-12-07 15:57:43
【问题描述】:
Silverlight 应用程序可以通过多种不同方式连接回其服务器。包括
对于这些,请说明它的用途以及您何时会或不会使用它。我不是在寻找大量细节,只是在它们之间进行选择的一组“经验法则”。
(问题在于,在设计您的第一个 Silverlight 应用程序时,您知道在没有时间学习所有这些应用程序时要使用什么。)
如果我在这个问题中将 Silverlight 替换为 WPF,会对您的答案产生什么影响? (我假设使用 WPF,由于防火墙和管理策略,直接连接到数据库不是一种选择。)
【问题讨论】:
标签:
wcf
silverlight
rest
wcf-ria-services
wcf-data-services
【解决方案1】:
我的两(欧元)美分:
WCF 似乎最适合将服务视为应用程序的业务层时,也就是说,当您的服务具有“智能”操作时,例如 “CalculateDiscountForClient” .
ADO.NET 数据服务(实际上,只是一个 REST 实现)在您的应用程序基本上以数据为中心并且服务只是数据库的前端时似乎合适。也就是说,您所有的服务方法都是 GetCustomers、CreateInvoice、 等类型的。
RIA 服务 是一种非常新的技术,我还没有尝试过,但是创建 Silverlight 部分和服务紧密耦合的应用程序似乎很有用:您定义您在服务项目中的服务类和方法,它们会在设计时自动复制到 Silverlight 项目。此外,您可以定义 WCF 样式的“操作”方法和 ADO.NET 数据服务样式的“数据”方法。看起来很有希望。
如果将来有可能将客户端部分从 Silverlight 更改为任何其他技术(例如 HTML+AJAX),请使用 POX,因为它是最具互操作性的选项。
关于 WPF 的差异,我唯一能想到的是,对于数据访问,我会尽可能使用直接 ADO.NET 数据连接(正确嵌入数据访问层、LINQ to SQL 等)而不是ADO.NET 数据服务,因为它更加灵活。无论如何,我必须说我从未在 WPF 中开发过任何东西。
【解决方案3】:
我想我再也不会去 POX 了。如果您编写 WCF 以便服务本身独立于绑定并且绑定在配置文件中完成,那么 WCF 几乎与传输和协议无关。它可以执行 SOAP、JSON、REST 或它自己的二进制序列化形式。所有这些都在绑定中。在内部,WCF 仅指定在操作和数据协定(均由类、方法和属性属性定义)方面公开的内容。 WCF 在这方面为您提供了极大的灵活性,2010 年还会提供更多。
在 Silverlight 方面,WCF 要求您编写一些管道代码。 .NET 框架具有在 Silverlight 项目中构建代理的工具,但您必须准备好异步处理所有 WCF 响应,并且代理无法捕获服务引发的异常。
.NET RIA 服务隐藏了这一切。它在幕后使用 WCF,但这是完全隐藏的。您不必编写异步代码。您定义一次验证,主要是声明式的,它在服务器端和客户端都有效。第 1 版将针对 Silverlight,因此您无法在其他地方使用该服务。这个范围应该会在以后的版本中扩大。
我对 ADO.NET 数据服务了解不够,无法进行比较。我怀疑答案将取决于您是否希望将数据暴露给 Silverlight 以外的其他用途。
.NET RIA 服务看起来是我想要的方向(我自己研究这些问题,考虑到一个大型应用程序)。对我来说,最大的问题是在服务层实现非常大的功能集合,并且无法直接对数据访问层进行编码(我们必须能够在 SQL Server 或 Oracle 上运行)。
使用 WPF 而不是 Silverlight 会改变一切,具体取决于您的数据所在的位置。这就像 Winforms 与 ASP.NET 的老问题。使用 WPF,您正在构建一个 Windows 客户端应用程序,并且您根本不需要使用任何形式的基于服务的数据接口,除非您的数据访问迫使您使用它。您仍然需要使用 MVVM、MVC 或 MVP 将数据和业务与表示代码分开。除此之外,您可以选择将数据访问视为一个层,而不是一个完全独立的层。
【解决方案4】:
WCF 是 Microsoft 的服务通信标准。我强烈建议任何人使用将于 2012 年 4 月发布的 WCF Web API(使用 WCF,但专门为 REST 定制)创建服务层。WCF Web API 目前处于预览模式。
记住这些经验法则:
- 你的 UI 会比你的服务层改变得更快。 RESTful 服务将在几年后出现,Silverlight 可能不会
- 你的服务会成为 API 吗?嗯...WCF REST 是要走的路
- 你会混合使用 JavaScript 和 Silverlight 代码吗? WCF REST 将使您的生活更轻松
- 你有移动组件吗(因为 Silverlight 不能在 iOS 或 android 上运行)...首选 REST。
不要为技术量身定制,而是要为整个应用量身定制。
【解决方案5】:
如果您想创建 Silverlight 应用程序并且您不关心其他客户端,那么我会选择 RIA 服务。使用起来非常轻松,您无需担心来自客户端的连接是如何建立的(即无需客户端配置)。 RIA 还为客户端上的所有实体生成类,如果需要,您甚至可以与客户端共享您自己的“服务器”代码(对于枚举或扩展方法很有用)。
备注:
- 我从未尝试过,但如果您确实需要,您也可以通过其他客户端访问 RIA 服务,毕竟 RIA 服务是建立在 WCF 服务之上的。
- 我不太了解 Akash Kava 的安全问题。您可以(并且必须)控制服务器端的安全性,就像您对任何其他服务所做的那样。