2

我有两个逻辑上不同的 WCF 服务,我希望将它们分开。它们每个都有一个返回相同数据合同的操作。单个 silverlight 客户端同时使用这两种服务。当我在 silverlight 客户端中为每个服务添加服务引用时,单个数据合同在生成的代码中结束了两次。是否可以让两个服务引用使用相同的数据合同定义?

根据我的阅读,对于非 silverlight 客户端,可以通过将数据合同编译成一个单独的程序集,服务器和客户端都引用该程序集。然而,这对于 silverlight 是不可能的(至少在 silverlight 3 中)。

谢谢,
罗伯

4

3 回答 3

2

斯蒂安,

感谢您的快速回复。我观看了 Miguel Castro 的截屏视频,内容非常丰富。不幸的是,它没有涵盖silverlight的情况。但是,以此为起点,我能够得到一些其他人可能会觉得有用的东西。

创建两个程序集:ServerDataContracts 和 SilverlightDataContracts(这一个作为 silverlight 程序集)。在每个人的 AssemblyInfo.cs 中添加以下行:

[assembly: ContractNamespace("http://YourNamespaceUri",
 ClrNamespace = "YourDataContractsNamespace")]

将所有 DataContracts 添加到 ServerDataContracts 程序集。在 SilverlightDataContracts 程序集中,右键单击项目(或子文件夹)并选择“添加现有项”。浏览到 ServerDataContracts 程序集中的 DataContracts 并选择要添加的那些。不要点击“添加”!!!相反,单击“添加”旁边的向下箭头并选择“添加为链接”。这会将 SilverlightDataContracts 项目链接到 ServerDataContracts 项目中的现有文件。现在,当您编辑一个项目时,两个项目都会得到更改。编译时,项目会使用正确的目标单独编译。

现在添加 ServerDataContracts 程序集作为对您的服务合同项目的引用。对 Silverlight 应用程序的 SilverlightDataContracts 程序集执行相同的操作。当您将来自 silverlight 客户端的服务引用添加到您的服务时,它不应生成数据合同。它应该改为使用您程序集中的那些。

我已经完成了这项工作,但是它仍然缺少生成的数据合同类提供的一些功能。生成的类实现了 INotifyPropertyChanged,这在 silverlight/wpf 中进行数据绑定时非常有用。虽然您可以自己实现它,但它相当乏味,现在您的服务器代码必须在每个属性集上执行所有这些事件处理程序,即使您可能永远不会订阅服务器上的 PropertyChanged 事件。

我仍在寻找一种更清洁的方法来处理这个问题。看起来 silverlight 4 将使这更容易,因为您可以在客户端和服务器中使用相同的程序集(编译的代码是兼容的)。不幸的是,这对我的需求来说太远了。

于 2010-02-18T21:41:52.140 回答
1

您是否尝试过使用 svcutil 生成客户端。如果您提供多个服务端点,则一切正常,但它会给您带来大量生成客户端的错误。

于 2010-02-26T03:55:45.290 回答
0

这很烦人,但它起作用了。我有一项主要服务和几项辅助服务。所有数据契约所属的主要服务,支持服务应重用主要服务中指定的数据契约。

我创建了一个 silverlight 程序集,仅作为主要服务的客户端。然后我让我的 silverlight 应用程序引用它。然后在 silverlight 应用程序中,我添加了我的支持服务。添加支持服务时,高级屏幕允许您指定它是否应重用引用程序集中的类型。默认开启。由于主要服务是在引用程序集中指定的,因此所有支持服务都使用主要服务中的数据合同。

它不漂亮,但它有效。

于 2010-02-18T22:17:49.283 回答