我正在为我的合同生成WCF代理。 合同包含实现接口的类。 在生成的代理上,界面消失了。 所以我不能用它。
有没有办法以某种方式标记接口以在代理文件上生成?
以下是一个联系示例:
public interface IMyGeneralInterface
{
int? ID { get; set; }
}
[DataContract]
public abstract class EntityBase : IMyGeneralInterface
{
[DataMember]
public virtual int? ID { get; set; }
}
生成的代理不包含IMyGeneralInterface的任何定义,它不允许我在客户端使用它。
我该怎么办?
谢谢, 达尼
答案 0 :(得分:3)
在客户端和服务器之间交换的消息必须是具体的类,可以在发送方和接收方之间进行序列化和反序列化。这使得几乎不可能来回发送接口。重要的是:您在客户端和服务器之间交换消息 - NOT 包含信息和行为的对象。
所有客户端看到他导入服务描述时都是“EntityBase”类型的数据协定 - 他没有看到任何其他内容。数据在XML模式中描述,而XML模式不具有接口概念。
请记住:WCF是可互操作的 - 您的客户端可能是PHP或Java客户端,它们可能不支持接口的概念。
如果您控制服务的两端(服务器和客户端),可以做的唯一事情就是将您的服务和数据合同放入自己的程序集中,然后在客户端之间共享该程序集和服务器。这样,您可以在客户端和服务器之间“传输”有关服务和数据合同的更多信息,但您在此过程中失去了任何互操作性的机会。
有关在WCF客户端和服务器之间共享程序集的更多信息,请参阅这些博客文章:
马克
答案 1 :(得分:0)
如果您确实需要在生成的代理类型上实现接口,则可以选择对生成的类型进行部分分类。我相信标准生成的代理类通常标记为部分和公共。
public partial class GeneratedType : IMyGeneralInterface {}
当然,您仍然必须与客户端和服务器端程序集共享您的接口,因此这不会解决您在上一个答案中表达的互操作性问题,并且不会免费生成,但有时它可能是是有用的。
我总是喜欢将共享接口保存在单独的程序集中,以避免任何服务器端对象的共享接口,以避免从服务到客户端共享类型(我发现这会让人感到困惑)。