2010-10-23 72 views
0

我正在使用WCF与我的服务器进行通信的Windows Phone 7应用程序。我可以在我的WCF客户端代码中使用接口作为类型吗?

我已经创建了一个服务,并且能够良好地通信,但我无法访问客户端代码中的一个接口。

举例来说,在我的服务器代码,我有这样的事情:

[OperationContract] 
[ServiceKnownType(typeof(IField))] 
[ServiceKnownType(typeof(TextField))] 
[ServiceKnownType(typeof(NumberField))] 
FieldForm GetForm(); 

现在我FieldForm包含以下声明:

[DataContract] 
class FieldForm 
{ 
    public List<IField> Fields { get; set; } 
} 

最后,这IField接口有几个实现:

interface IField 
{ 
    string Name { get; set; } 
} 

[DataContract] 
class TextField : IField 
{ 
} 

[DataContract] 
class NumberField : IField 
{ 
} 

(这不是我的代码,但描述了我想要的完成)

现在在我的客户端上,我通过WCF收到一个FieldForm对象,并希望遍历Fields列表以确定要创建的UI元素。问题是,该服务没有在客户端提供IField接口,但我确实有可用的实现(TextField和NumberField)。

这导致了一些蹩脚的代码在我的客户端代码,如:

foreach (object field in Fields) 
{ 
    if (field is TextField) 
     // do textfieldy stuff 
    else if (field is NumberField) 
     // do numberfieldy stuff 
} 

当我真的喜欢就用:

foreach (IField field in Fields) 
{ 
    field.Name; 
} 

我缺少在界面上简单的注解为了使接口类型在客户端上可用,或者WCF是否仅提供序列化接口的能力?

有没有一种方法可以访问我的客户端代码中的界面?

回答

1

不,您不能通过WCF连接序列化接口。

WCF使用序列化(XML)消息在客户端和服务器之间进行通信 - 您可以在XML模式(XSD)中表达的所有内容都可以跨越。这基本上意味着任何具体的类型,由int,string等原子类型组成。XSD也支持继承和枚举,但这是关于旗杆的末端。

如果你控制通信链接的两端(例如服务器和客户端),你可以做的是将这些接口(服务接口和你的数据合约和接口)放入一个共同的共享程序集,然后您的客户项目和服务器项目将参考。在具体的服务实现中使用任何实现你的接口的类,但是通过这个程序集共享,你可以在客户端使用你喜欢的签名,并根据接口进行编程。请注意:这会“杀死”WCF服务的所有互操作性 - Ruby或Java客户端无法再调用您的服务。

+0

谢谢!我非常喜欢共享程序集的想法,尽管这对于这个特定的项目来说是过分的。不过,我一定会记住未来的战略。 – 2010-10-23 18:47:19

相关问题