我不知道有什么好方法可以让多个 WCF 代理继承一个公共基类。您可以手动编辑添加服务引用时生成的代码,但这不利于可维护性。
但是,如果您在客户端和服务器之间共享合同程序集,则可以让多个代理使用相同的基本接口。然后,您可以编写一个客户端帮助程序类(可能使用扩展方法)来在基本接口上执行常见操作。您也可以将帮助程序类放入共享程序集中,并从多个客户端重用它。
不过,我还没有使用过双工绑定,所以我不确定这是否会带来复杂性。
例如,假设您有两个服务 Calculator 和 Echo,并且每个服务都需要实现一个 Keepalive 方法。您可以定义三个服务契约接口:
[ServiceContract]
public interface IStatefulService
{
[OperationContract]
void KeepAlive(int sessionID);
}
[ServiceContract]
public interface ICalculator : IStatefulService
{
[OperationContract]
int Add(int a, int b);
}
[ServiceContract]
public interface IEcho : IStatefulService
{
[OperationContract]
string Echo(string message);
}
您可以将服务契约接口放在客户端和服务器共享的公共类库中。
在服务器上,您将拥有 ServiceBase 类,它将实现 IStatefulService 并包含 keepalive 处理代码。您将拥有一个具体的 CalculatorService,它派生自 ServiceBase 并实现 ICalculator;以及一个具体的 EchoService,它派生自 ServiceBase 并实现 IEcho。
在客户端,您需要两个代理,每个服务一个。理论上,您可以使用“添加服务引用”和“重用引用程序集的类型”复选框来生成代理 - 但我遇到了这方面的问题。相反,您可以直接使用 ChannelFactory,如下所示:
var echoer = (new ChannelFactory<IEcho>("")).CreateChannel();
Console.WriteLine(echoer.Echo("hello"));
var calculator = (new ChannelFactory<ICalculator>("")).CreateChannel();
Console.WriteLine(calculator.Add(2, 3));
(在生产代码中,您希望重用通道工厂,而不是像这样动态创建它们。并且您将处置代理,并且您将进行错误处理......)
您还需要在客户端配置文件中设置端点。
一旦您的两个代理共享一个基本接口,您就可以编写一个实用程序类来帮助您使用该接口。