我正在尝试将功能添加到C#中的现有代码并调用api,例如MyAPI(arg1,arg2)。
我有一个接口,可以说是IProvider,它具有一组客户端API定义。我有两个客户端代理类-Provider和ProviderNew,它们有一些API的包装实现-在每个包装函数(对于API)中,我们称之为最终调用托管在远程服务器上的服务API。仅在ProviderNew(Not Provider)项目类下-在Service reference下-我看到在WSDL,xsd文件中定义了MyAPI(或自动生成了,因为我不确定如何创建这些文件)。添加到这些内容中,我仅在ProviderNew上看到一些reference.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中实现它们时,我看到一个错误(这是一个经典情况,每个实现接口的类(如果有多个实现)都应自己单独实现其所有功能,而不是子集功能)。
'提供者'未实现接口成员'IProvider.MyAPI(int,int)'MyPath ... Provider.cs
我已尽力使这一点尽可能清楚,让我知道更多。
我该如何进行?有什么建议么 ?
最佳答案
一个实现类不能选择要选择实现接口的部分-全部或全部。从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.创建一个继承自原始合同的新合同,并通过新服务公开它,然后只有需要其他功能的客户端才能使用新服务。