C# WCF服务继承

C# WCF服务继承,c#,wcf,inheritance,C#,Wcf,Inheritance,我有一个非常复杂的服务主机,它由多个双工服务组成。它们提供了一些常见的功能(连接、断开连接、保持激活等),但除此之外,它们各自都提供了非常具体的功能 我的所有服务都继承自一个公共基类(抽象) 因此,我还负责客户端应用程序的一部分,我希望在基类中处理连接、断开连接、保持活动ping和重新连接(等)的行政官僚处理,这样我就可以遵守DRY原则,并强制其他开发人员不要实现他们自己的连接处理 有没有办法让WCF公开服务基类,这样我就可以为客户端应用程序中的官僚浪费创建一个公共包装类 我真的不想看到未来客户

我有一个非常复杂的服务主机,它由多个双工服务组成。它们提供了一些常见的功能(连接、断开连接、保持激活等),但除此之外,它们各自都提供了非常具体的功能

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

因此,我还负责客户端应用程序的一部分,我希望在基类中处理连接、断开连接、保持活动ping和重新连接(等)的行政官僚处理,这样我就可以遵守DRY原则,并强制其他开发人员不要实现他们自己的连接处理

有没有办法让WCF公开服务基类,这样我就可以为客户端应用程序中的官僚浪费创建一个公共包装类

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

如果你允许这种咆哮:


为什么,为什么,为什么微软对清洁代码开发的最佳实践和基本原则如此轻视?这与INotifyPropertyChanged类似,在INotifyPropertyChanged中,人们被迫编写大量不必要的重复代码,而不是提供一个简单的属性来通知属性…

我不知道有什么好方法可以让多个WCF代理从一个公共基类继承。您可以手动编辑添加服务引用时生成的代码,但这不利于维护性

但是,如果在客户机和服务器之间共享契约程序集,则可以让多个代理使用相同的基本接口。然后,您可以编写一个客户端助手类(可能使用扩展方法)来在基本接口上执行常见操作。您也可以将helper类放入共享程序集中,并从多个客户端重用它

不过,我还没有使用过双工绑定,所以我不确定这是否会带来复杂性

例如,假设您有两个服务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类,它将实现IStateFulsService并包含keepalive处理代码。您将拥有一个从ServiceBase派生并实现ICalculator的具体计算器服务;以及从ServiceBase派生并实现IEcho的具体EchoService

在客户端上,您需要两个代理,每个服务一个。理论上,您可以使用“添加服务引用”和“从引用的程序集重用类型”复选框生成代理,但我遇到了这个问题。相反,您可以直接使用ChannelFactory,如下所示:

var echoer = (new ChannelFactory<IEcho>("")).CreateChannel();
Console.WriteLine(echoer.Echo("hello"));

var calculator = (new ChannelFactory<ICalculator>("")).CreateChannel();
Console.WriteLine(calculator.Add(2, 3));
var echoor=(新的ChannelFactory(“”)。CreateChannel();
Console.WriteLine(echor.Echo(“你好”);
变量计算器=(新的ChannelFactory(“”)。CreateChannel();
Console.WriteLine(calculator.Add(2,3));
(在生产代码中,您希望重用通道工厂,而不是像这样动态地创建它们。您需要处理代理,并且需要进行错误处理…)

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


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

您可以给出一个示例,说明您希望在客户端上实现的服务基类中的某些内容吗?当然可以!重新连接、保持活动状态ping到服务器(以了解服务何时断开连接)…非常感谢,我现在就实现它。事实上,我已经打开了这两个解决方案!:-)