这个问题是关于Microsoft WCF上下文中的编程和最佳实践的理论问题,特别关注Web 服务。
Web服务中的继承
考虑一种情况,当我们需要定义一些功能时。我们希望使用 Web 服务向世界公开这些功能。功能由接口建模(在处理分布式系统等时这是一个非常好的实践)。所以我们有如下内容:
///
/// Functionalities for a certain context, calling them A functionalities
///
public interface IFunctionalitiesA {
FunctionalityA1ResMsg FunctionalityA1(FunctionalityA1ReqMsg msg);
FunctionalityA2ResMsg FunctionalityA2(FunctionalityA2ReqMsg msg);
FunctionalityA3ResMsg FunctionalityA3(FunctionalityA3ReqMsg msg);
}
///
/// Functionalities for a certain context, calling them B functionalities
///
public interface IFunctionalitiesB {
FunctionalityB1ResMsg FunctionalityB1(FunctionalityB1ReqMsg msg);
FunctionalityB2ResMsg FunctionalityB2(FunctionalityB2ReqMsg msg);
}
///
/// Functionalities for a certain context, calling them C functionalities
///
public interface IFunctionalitiesC {
FunctionalityC1ResMsg FunctionalityC1(FunctionalityC1ReqMsg msg);
FunctionalityC2ResMsg FunctionalityC2(FunctionalityC2ReqMsg msg);
FunctionalityC3ResMsg FunctionalityC3(FunctionalityC3ReqMsg msg);
FunctionalityC4ResMsg FunctionalityC4(FunctionalityC4ReqMsg msg);
}
///
/// Functionalities for a certain context, calling them D functionalities
///
public interface IFunctionalitiesD {
FunctionalityD1ResMsg FunctionalityD1(FunctionalityD1ReqMsg msg);
FunctionalityD2ResMsg FunctionalityD2(FunctionalityD2ReqMsg msg);
}
现在让我们考虑所有这些功能都可以通过一些服务来实现。但是,拥有一个服务来实现它们并不是强制性的。一个服务可以实现其中的一些,而另一个服务可以实现其中的另一个子集。我特别要求考虑以下情况:
///
/// This service implements functionalities A and B.
///
public class ServiceS1 : IFunctionalitiesA, IFunctionalitiesB {
... /* Implementing interfaces methods */
}
///
/// This service implements functionalities C and D.
///
public class ServiceS2 : IFunctionalitiesC, IFunctionalitiesD {
... /* Implementing interfaces methods */
}
请特别注意,这两个服务将在内部创建一些重要的东西。我的意思是他们拥有只有他们才能访问的资源,例如第一个服务可能会保留一个元素数组,第二个也是如此。简而言之,它们不是虚拟服务,它们具有状态和资源,并且受到外部访问的保护(因此它们被声明为public
or protected
)。
现在让我们考虑我们想要实现一个服务,可能在不同的站点上运行,它实现了所有的功能。在处理各自实现的方法时,该服务的行为将与上述两个完全相同。不幸的是,我们不能从它们两者中得出。所以我们需要这样做:
public class GlobalService :
IFunctionalitiesA, IFunctionalitiesB, IFunctionalitiesC, IFunctionalitiesD {
...
}
封装……可以是答案吗?
问题是:
如何重用实现整体功能子集的两个服务中的逻辑?
我最终考虑做这样的事情:
public class GlobalService :
IFunctionalitiesA, IFunctionalitiesB, IFunctionalitiesC, IFunctionalitiesD {
///
/// Encapsulating ServiceS1
///
protected ServiceS1 srvs1;
///
/// Encapsulating ServiceS2
///
protected ServiceS2 srvs2;
public GlobalService() {
this.srvs1 = new ServiceS1();
this.srvc2 = new ServiceS2();
}
///
/// Methods are redirected internally to the reused implementation
/// This is to be done for all methods
///
public FunctionalityA1ResMsg FunctionalityA1(FunctionalityA1ReqMsg msg) {
return thissrvs1.FunctionalityA1(msg);
}
...
}
通过这样做,我可以重用已实现的逻辑,而无需一次又一次地创建冗余代码。当然,这可能是一种仅限于某些情况的方法,但在这些情况下(毕竟没有那么严格)。
这是解决问题的好方法吗?你有不同的想法吗?