C#中的一个接口和两个实现类(代理)

时间:2013-08-17 15:43:58

标签: c# wcf web-services api oop

我正在尝试在C#中为现有代码添加一个功能并调用api,比如MyAPI(arg1,arg2)。 我有一个接口,让我们说IProvider,它有一组客户端API定义。我有两个客户端代理类 - Provider和ProviderNew,它们有一些API的包装器实现 - 在每个包装函数(对于API)中,我们调用最终调用托管在远程服务器上的服务API。仅在ProviderNew(Not Provider)Project类下 - 在Service引用下 - 我看到在WSDL,xsd文件中定义了MyAPI(或自动生成,因为我不确定这些文件是如何创建的)。除此之外,我还看到了一些仅针对ProviderNew的references.cs文件,其中包含MyAPI的一些定义。这些事情清楚地表明只有ProviderNew实现了MyAPI的客户端代理代码。

我现在的问题是,由于IProvider接口MyAPI签名,系统要求实现类(Provider和ProviderNew)实现MyAPI的客户端代码,但不是这样,因为只有ProviderNew为MyAPI添加了定义。当我尝试单独在Provider.cs中实现MyAPI客户端代码时,我看到一个错误 -

Provider.ProviderServiceReference.ProviderServiceClient不包含“MyAPI”的定义,并且没有扩展方法“MyAPI”可以找到类型为“Provider.ProviderServiceReference.ProviderServiceClient”的第一个参数(您是否遗漏了) using指令或程序集引用?)MyPath .. \ Provider.cs

但是,当我离开而没有在Provider.cs中实现它们时,我看到一个错误(这是一个经典案例,每个类(如果有多个实现)实现一个接口,应该单独实现它的所有功能和不是功能的子集。)

'Provider'未实现接口成员'IProvider.MyAPI(int,int)'MyPath ... Provider.cs

我尽力使这一点尽可能清楚,让我知道更清晰。

我该怎么办?有什么建议吗?

1 个答案:

答案 0 :(得分:1)

实现类无法选择要实现的接口部分 - 全部或全部。从WCF的角度来看,如果要为一个客户端而不是另一个客户端添加操作(方法),则需要查看两个服务,而不是一个。

例如,假设您有以下合同:

[ServiceContract]
public interface IProvider
{

    [OperationContract]
    int MyApiCall_1(string param);

    [OperationContract]
    string MyApiCall_2(int number);
}

由提供商(最初)实施。所有客户都使用这项服务。

现在让我们说你的一个客户需要访问MyApiCall_3,但其余的则不需要。正如您所发现的那样,对于所有不需要MyApiCall_3的客户来说,这将成为一个重大变化。

可以简单地更新服务 - 但是所有客户端都可以访问MyApiCall_3,也许你出于某种原因不希望这样。

另一个选择是创建另一个从原始合同派生的合同(接口),如下所示:

[ServiceContract]
public interface INewProvider : IProvider
{

    [OperationContract]
    double MyApiCall_3();
}

然后,您将在新服务中实现合同(为简单起见,我们称之为NewProvider)。需要额外API调用的客户端将使用NewProvider,而其他客户端将使用旧版Provider

简而言之,如果您要为合同添加功能,您可以:

1.  Make that additional functionality available in the original contract and thereby all clients will have access to it, or
2.  Create a new contract that inherits from the original contract and expose it via a new service, and then only the clients that need the additional functionality would use the new service.