【问题标题】:One interface and Two implementing classes (proxy) in C#C#中的一个接口和两个实现类(代理)
【发布时间】:2013-08-17 15:43:57
【问题描述】:

我正在尝试向 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

我已尽最大努力使这一点尽可能清楚,请让我知道以更清楚。

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

【问题讨论】:

  • 也许你可以用简化的简单代码更正式地表述它?

标签: c# wcf web-services api oop


【解决方案1】:

实现类不能选择接口的哪些部分来实现——要么全有,要么全无。从 WCF 的角度来看,如果您想为一个客户端而不是另一个客户端添加操作(方法),那么您正在查看两个服务,而不是一个。

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

[ServiceContract]
public interface IProvider
{

    [OperationContract]
    int MyApiCall_1(string param);

    [OperationContract]
    string MyApiCall_2(int number);
}

由 Provider 实现(最初)。所有客户都在使用这项服务。

现在假设您的一个客户需要访问 MyApiCall_3,但其他客户不需要。正如您所发现的,这对于所有不需要 MyApiCall_3 的客户端来说都是一个重大变化。

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

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

[ServiceContract]
public interface INewProvider : IProvider
{

    [OperationContract]
    double MyApiCall_3();
}

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

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

1. 在原始合同中提供该附加功能,从而所有客户都可以访问它,或者 2. 创建一个继承于原始合约的新合约,并通过新服务公开它,然后只有需要附加功能的客户端才能使用新服务。

【讨论】:

  • 很好的答案,如果我有一个选择,我会投票两次 :) 总而言之,我可以像所有客户都可以访问新 API 一样进行操作,或者派生并实施它通过一项新服务,新客户端将访问所有三个 API。太棒了!
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2020-07-08
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多