WCF和接口继承 - 这是一件可怕的事吗?

时间:2009-01-22 20:46:11

标签: .net wcf inheritance interface

我的应用程序有2个“服务”,假设一个是基本(整数)计算器,一个是浮点计算器。我将这些表达为如此接口:

public interface IBasicCalculator
{
    int Add( int a, int b );
}

public interface IFloatingPointCalculator
{
    double Add( double a, double b );
}

我想通过WCF公开这些。不幸的是,WCF似乎与以下概念密切相关:您希望公开的每个可能的操作必须通过一个服务接口 - 您不能在服务之间共享会话,从客户端开始,因为您需要创建一个很麻烦每个人的单独代理,似乎没有任何“子服务”等...

所以,我已经收集到了我需要提供一个“组合”界面(也可以称之为外观),如下所示:

[ServiceContract]
public interface ICalculatorService : IBasicCalculator, IFloatingPointCalculator
{
    [OperationContract(Name = "AddInt")]
    new int Add( int a, int b );

    [OperationContract(Name = "AddDouble")]
    new double Add( double a, double b );
}

如果我这样做,那么WCF会向客户端公开这两种方法,这些方法可以调用它们,而且它实际上都有效。

然而,像这样的“继承接口”似乎是笨拙的。 特别 new int Add new double Add。严格地说,方法上的new表示隐藏了一个基本方法,我实际上并没有这样做。我可以省略new,但后来我得到的编译器警告相当于“我想我隐藏了这个方法,你需要重命名它或者把'新'放在它上面。”

所以,这是一个由两部分组成的问题:

  1. 我是否将“将所有内容合并为一个界面”逻辑,或实际上是否有办法使用WCF公开“子服务”或“多个链接服务”?

  2. 如果这是需要做的,有更好的方法吗?

  3. 谢谢!

3 个答案:

答案 0 :(得分:8)

我刚刚发现你可以将多个端点(每个端点使用不同的接口)暴露给同一个服务,你仍然只需要在客户端上生成一个代理lib,它可以访问所有这些端点,这完全解决了我的问题

答案 1 :(得分:4)

我会说一般,不。请记住,您正在处理分布式应用程序技术,而不是分布式对象技术,因此继承等概念不适用。

一般情况下,我不会走这条路,而是拥有特定的合约,这些合约代表您希望通过端点公开的操作的逻辑分组。

答案 2 :(得分:3)

我相信你所描述的并不是真正的最佳实践。当然,在服务类型上实现多个服务合同是可行的,因为它只是实现多个接口的问题。

WCF当然可以支持使用唯一URI和独立合同进行通信的多个端点。但是,ClientBase类只接受一个契约接口类型这一事实,例如,几乎意味着代理类,即使它们存储在同一个库中,仍然需要明确地只实现一个契约接口。

如果您实际上只创建了一个代理类定义,我很想知道您是如何成功完成此任务的。我可能会误解你的需求。实现不同的代理类为您提供了最大的灵活性,因为对于不同的合同,诸如IsInitiating和IsTerminating之类的OperationContractAtrribute值可能会有所不同。如您的示例所示,组合两个合同的接口可能会更改您在服务合同上对方法进行属性的方式。