2009-10-11 59 views
1

我正在为我的合同生成一个WCF代理。 契约包含实现接口的类。生成的代理上的 接口不见了。 所以我不能使用它。生成WCF代理到服务器接口

有没有办法在代理文件上以某种方式标记接口?

这是一个接触例如:

public interface IMyGeneralInterface 
{  
    int? ID { get; set; } 
} 

[DataContract] 
public abstract class EntityBase : IMyGeneralInterface 
{   
    [DataMember] 
    public virtual int? ID { get; set; } 
} 

生成的代理将不包含任何定义,IMyGeneralInterface的,不会让我使用它一个客户端。

我该怎么办?

谢谢, 达尼

回答

3

消息在客户端之间交换和服务器必须混凝土类,可以被序列化和发送者和接收者之间反序列化。这使得几乎不可能发送来回接口。重要的是:您在客户端和服务器之间交换消息 - 不是具有信息和行为的对象。

所有客户端在导入服务描述时看到的是一个类型为“EntityBase”的数据合同 - 他什么也看不到。数据以XML模式描述,并且XML架构而不是具有接口的概念。

请记住:WCF可以互操作 - 您的客户端可以是PHP或Java客户端,并且他们可能不支持接口概念。

如果你控制服务(包括服务器和客户端)的两端你可以唯一要做的是把你的服务和数据合同到自己组装,然后共享组件的客户端和服务器之间。这样,您就可以“传输”更多有关您的服务和您的客户端和服务器之间的数据合同的信息,您将失去在此过程中互操作性的任何可能性。

详情参见这些博客文章对WCF客户端和服务器之间共享组件:

马克

+0

嗨马克, 我们使用了这种方法,但它使我们遇到了一些问题,因为我们通过WCF传递的所有集合都变成了数组(因此我们无法向它们添加任何东西)。 所以解决方案是使用生成的代理(它解决了这个问题),现在我正在将生成的工作人员从共享的DLL中分离出来,在这里我们使用接口。 我在想,我们可以将它们保留在共享的dll中(因为我们不需要互操作性,并且尝试在同一个解决方案中混合生成的代理文件和共享dll – Dani 2009-10-11 11:59:29

+1

那么,这是另一回事:基本上,所有XML模式支持的“集合”都是数组 - 在XML模式中没有别的东西,但是您可以指定(当您创建代理时)想要放弃此限制并使用集合或通用列表 - 再次,丢失一些互操作性,但是让纯.NET开发商更容易一些。查看“添加服务引用”屏幕上的各种选项(或“svcutil.exe”的命令行选项) – 2009-10-11 12:02:11

0

如果您确实需要在您生成的代理类型上实现接口,则可以使用部分分类生成的类型。我相信标准生成的代理类通常被标记为部分和公共。

public partial class GeneratedType : IMyGeneralInterface {} 

当然,你还是会最终不得不与客户端和服务器端组件分享您的界面,以便为有声的在前面的答案,不会免费来产生这不会解决你的互操作性问题,但有时它可能是有用的。

我总是喜欢将共享接口保存在一个单独的程序集中,以避免共享类型从服务端到客户端(否则我会发现这很让人困惑)。