我可以在WCF客户端代码中使用接口作为类型吗?

时间:2010-10-23 07:01:51

标签: wcf windows-phone-7

我正在使用WCF与我的服务器进行通信的Windows Phone 7应用程序。

我已经创建了一项服务,并且能够很好地沟通,但我在访问客户端代码中的界面时遇到了问题。

例如,在我的服务器代码中,我有类似的东西:

[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 个答案:

答案 0 :(得分:1)

不,您无法跨WCF连接序列化接口。

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

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