gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:17 26 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

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

例如,假设您有以下契约(Contract):

[ServiceContract]
public interface IProvider
{

[OperationContract]
int MyApiCall_1(string param);

[OperationContract]
string MyApiCall_2(int number);
}

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

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

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

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

[ServiceContract]
public interface INewProvider : IProvider
{

[OperationContract]
double MyApiCall_3();
}

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

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

1.  Make that additional functionality available in the original contract and thereby all clients will have access to it, or2.  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.

关于c# - C# 中的一个接口(interface)和两个实现类(代理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18290548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com