我正在使用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是否根本不提供序列化接口的能力?
有没有办法在我的客户端代码中访问我的界面?
答案 0 :(得分:1)
不,您无法跨WCF连接序列化接口。
WCF使用序列化(XML)消息在客户端和服务器之间进行通信 - 您可以在XML模式(XSD)中表达的所有内容都可以移动。这基本上意味着任何具体的类型,由int,string等原子类型组成.XSD也支持继承和枚举,但这是关于旗杆的结尾。
如果您控制通信链路的两端(例如服务器和客户端),您可以做的是将这些接口(服务接口和您的数据合同和接口)放入一个共同的共享程序集中然后将客户项目和服务器项目引用。在具体的服务实现中使用任何实现接口的类,但通过此程序集共享,您可以在客户端使用您喜欢的签名并针对接口进行编程。请注意:这会“杀死”您的WCF服务的所有互操作性 - 任何Ruby或Java客户端都无法再调用您的服务。