我正在尝试在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
我尽力使这一点尽可能清楚,让我知道更清晰。
我该怎么办?有什么建议吗?
答案 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.