WCF服务继承

Tur*_*ete 4 c# wcf inheritance

我有一个非常复杂的服务主机,其中包含多个DUPLEX服务。它们提供了一些通用功能(连接,断开连接,KeepAlive等),但除此之外,它们每个都提供了非常特定的功能。

我所有的服务都继承自一个公共基类(抽象)。

因此,我还负责部分客户端应用程序,并且希望在基类中进行管理官僚化的连接,断开连接,保持活动ping和重新连接(等...)的官僚主义处理,以便观察DRY原理并强制其他开发人员不要实现自己的连接处理。

有什么方法可以让WCF公开服务基类,以便我可以为客户端应用程序中的官僚浪费时间创建一个通用包装类?

我真的不想看到每个未来的客户端组件开发人员都创建自己的包装器吗?

而且,如果您允许咆哮:

为什么,为什么,为什么Microsoft完全忽略了干净代码开发的最佳实践和基本原则?与此INotifyPropertyChanged相同-在这种情况下,人们被迫编写大量不必要的重复代码,而不是使用简单的属性来通知属性...

Ric*_*ier 5

我不知道使多个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);
}
Run Code Online (Sandbox Code Playgroud)

您可以将服务协定接口放在客户端和服务器都共享的通用类库中。

在服务器上,您将拥有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));
Run Code Online (Sandbox Code Playgroud)

(在生产代码中,您想重用渠道工厂,而不是像这样即时创建它们。并且您要处置代理,并且会出错处理...)

您还需要在客户端配置文件中设置端点。

一旦两个代理共享一个基本接口,就可以编写一个实用程序类,以帮助您使用该接口。