Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用封装来处理WCF服务继承问题怎么样?_C#_.net_Wcf - Fatal编程技术网

C# 使用封装来处理WCF服务继承问题怎么样?

C# 使用封装来处理WCF服务继承问题怎么样?,c#,.net,wcf,C#,.net,Wcf,这个问题是关于Microsoft WCF环境中的编程和最佳实践的理论问题,特别关注Web服务 web服务中的继承 考虑这样一种情况,我们需要定义一些功能。我们希望使用web服务向世界公开这些功能。功能由接口建模(在处理分布式系统等时,这是一个非常好的实践)。因此,我们有如下内容: /// /// Functionalities for a certain context, calling them A functionalities /// public interface IFunctiona

这个问题是关于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
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);
   }

   ...

}
通过这样做,我可以重用实现的逻辑,而无需一次又一次地创建冗余代码。当然,这种方法可能仅限于某些情况,但在这些情况下(毕竟没有那么严格)

这是解决问题的好办法吗?你有不同的想法吗