我有两个逻辑上不同的WCF服务,我希望将它们分开。它们每个都有一个返回相同数据的操作。单个Silverlight客户端会同时使用这两种服务。当我在silverlight客户端中为每个服务添加服务引用时,单个datacontract在生成的代码中最终两次。是否可以让两个服务引用使用相同的datacontract定义?
从我读过的内容来看,对于非Silverlight客户端,可以将数据交换编译成一个单独的程序集,该程序集由服务器和客户端引用。然而,对于silverlight来说这是不可能的(至少在silverlight 3中)。
谢谢,
罗布
答案 0 :(得分:2)
了Stian,
感谢您的快速回复。我观看了Miguel Castro的截屏视频,内容非常丰富。不幸的是,它没有涵盖银色的情况。然而,使用它作为起点,我能够得到一些其他人可能觉得有用的东西。
创建两个程序集:ServerDataContracts和SilverlightDataContracts(这个作为silverlight程序集)。在每个人的AssemblyInfo.cs中添加以下行:
[assembly: ContractNamespace("http://YourNamespaceUri",
ClrNamespace = "YourDataContractsNamespace")]
将所有DataContracts添加到ServerDataContracts程序集。在SilverlightDataContracts程序集中,右键单击项目(或子文件夹)并选择“添加现有项”。浏览到ServerDataContracts程序集中的DataContracts并选择要添加的那些。不要“添加”!而是单击“添加”旁边的向下箭头,然后选择“添加为链接”。这将SilverlightDataContracts项目链接到ServerDataContracts项目中的现有文件。现在当你编辑一个时,两个项目都会得到改变。编译时,项目将使用正确的目标单独编译。
现在添加ServerDataContracts程序集作为对服务合同项目的引用。为您的Silverlight应用程序执行相同的SilverlightDataContracts程序集。当您从silverlight客户端向服务添加服务引用时,它不应生成datacontracts。它应该使用你的程序集中的那些。
我已经完成了这项工作,但它仍然缺少生成的datacontract类提供的一些功能。生成的类实现了INotifyPropertyChanged,这在silverlight / wpf中进行数据绑定时非常有用。虽然您可以自己实现,但它相当繁琐,现在您的服务器代码必须在每个属性集上执行所有这些事件处理程序,即使您可能永远不会订阅服务器上的PropertyChanged事件。
我仍在寻找一种更清洁的方法来处理这个问题。看起来像Silverlight 4将使这更容易,因为你可以在客户端和服务器中使用相同的程序集(编译的代码是兼容的)。不幸的是,这对我的需求来说太遥远了。
答案 1 :(得分:1)
您是否尝试使用svcutil生成客户端?如果您提供多个服务端点,它们都能正常工作,但它会给您带来大量错误,从而产生客户端。
答案 2 :(得分:0)
这很刺激但它有效。我有一个主要服务,以及一些支持服务。所有数据交换所属的主要服务,支持服务应重用主服务中指定的数据。
我创建了一个silverlight程序集,仅作为主服务的客户端。然后我让我的silverlight应用程序引用它。然后在silverlight应用程序中,我添加了我的支持服务。添加支持服务时,高级屏幕允许您指定是否应重用引用的程序集中的类型。它默认开启。由于主服务是在引用的程序集中指定的,因此所有支持服务都使用主服务中的数据交换。
它不漂亮,但它有效。