2

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

我现在的问题是,由于 IProvider 接口 MyAPI 签名,系统期望实现类(Provider 和 ProviderNew)都实现 MyAPI 的客户端代码,但事实并非如此,因为只有 ProviderNew 为 MyAPI 添加了定义。当我尝试单独在 Provider.cs 中实现 MyAPI 客户端代码时,我看到一条错误消息 -

Provider.ProviderServiceReference.ProviderServiceClient 不包含“MyAPI”的定义,并且找不到接受“Provider.ProviderServiceReference.ProviderServiceClient”类型的第一个参数的扩展方法“MyAPI”(您是否缺少 using 指令或程序集引用?) MyPath..\Provider.cs

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

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

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

我该如何进行?有什么建议么 ?

4

1 回答 1

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. 在原始合同中提供该附加功能,从而所有客户都可以访问它,或者
2. 创建一个继承于原始合约的新合约并通过新服务公开它,然后只有需要附加功能的客户端才能使用新服务。
于 2013-08-17T19:07:28.927 回答