代码之家  ›  专栏  ›  技术社区  ›  Dani

生成WCF代理到服务器接口

wcf
  •  1
  • Dani  · 技术社区  · 15 年前

    我正在生成合同的WCF代理。 契约包含正在实现接口的类。 在生成的代理上,接口不存在。 所以我不能用它。

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

    以下是联系示例:

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

    生成的代理将不包含imyGeneralInterface的任何定义,这将使我无法在客户端使用它。

    我该怎么办?

    谢谢, 达尼

    2 回复  |  直到 13 年前
        1
  •  3
  •   marc_s    15 年前

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

    当他导入服务描述时,客户机看到的所有信息都是“EntityBase”类型的数据契约——他没有看到任何其他信息。数据是在XML模式中描述的,而XML模式则是 有一个接口的概念。

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

    你唯一的东西 能够 如果控制服务的两端(服务器和客户机),则需要将服务和数据协定放入它们自己的程序集中,然后在客户机和服务器之间共享该程序集。这样,您就可以在客户机和服务器之间“传输”关于您的服务和数据契约的更多信息, 但是 您在这个过程中失去了任何互操作性的机会。

    有关在WCF客户端和服务器之间共享程序集的详细信息,请参阅以下日志:

    马克

        2
  •  0
  •   The Senator    13 年前

    如果您确实需要在生成的代理类型上实现接口,那么另一种方法是对生成的类型进行部分分类。我相信标准生成的代理类通常标记为部分类和公共类。

    public partial class GeneratedType : IMyGeneralInterface {}
    

    很自然,您最终还是不得不与客户机和服务器端程序集共享接口,这样就不会像前面的答案中所说的那样解决互操作性问题,也不会免费生成,但有时它是有用的。

    与任何服务器端对象的接口相比,我总是喜欢将共享接口保存在单独的程序集中,以避免从服务到客户机的共享类型(否则我会觉得这很混乱)。