WCF - 在多个合同共享通用方法时寻找最佳实践

时间:2011-04-07 15:14:11

标签: c# wcf

我打算让一个核心模块公开接口,以便其他大模块(不同的客户端)与之通信。例如,如果有一组方法:

void Method_A();
void Method_B();
void Method_X1();

暴露给一种类型的客户端(模块“X1”)和:

void Method_A();
void Method_B();
void Method_X2();

向其他类型的客户端(模块“X2”)公开并知道Method_AMethod_B应该具有确切的实现...那么我该如何才能最好地设计服务架构(在服务和合同方面)?

是否有机会只实施一次Method_A和Method_B(在不同的合同实现中不是2次)?

使用WCF时,如何从界面继承中受益?

先谢谢大家,如果我需要说清楚,请告诉我!

@marc_s ...我真的很感激你的观点...

2 个答案:

答案 0 :(得分:3)

类可以继承满足接口的方法,因此您可以拥有一个IServiceBase接口和ServiceBase类,它只实现Method_AMethod_B,然后单独输出将独特的方法放入单独的接口中,最后在继承ServiceBase的类中将它们组合在一起,并实现Interface1或Interface2。例如:

[ServiceContract]
public interface IServiceBase
{
    [OperationContract]
    void Method_A();

    [OperationContract]
    void Method_B();
}

[ServiceContract]
public interface IService1 : IServiceBase
{
    [OperationContract]
    void Method_X1();
}

[ServiceContract]
public interface IService2 : IServiceBase
{
    [OperationContract]
    void Method_X2();
}

public abstract class ServiceBase : IServiceBase
{
    void Method_A()
    {
        ... implementation here ...
    }

    void Method_B()
    {
        ... implementation here ...
    }
}

public class Service1 : ServiceBase, IService1
{
    void Method_X1()
    {
        ... implementation here ...
    }
}

public class Service2 : ServiceBase, IService2
{
    void Method_X2()
    {
        ... implementation here ...
    }
}

答案 1 :(得分:2)

我被叫了!?!?! :-)

如果您有一个界面

public interface IServiceA
{
  void Method_A();
  void Method_B();
  void Method_X1();
}

和第二个

public interface IServiceB
{
  void Method_A();
  void Method_B();
  void Method_X2();
}

你绝对可以在服务器端共享两种常用方法的实现代码。

您在服务器上,在公共类库(或两个独立的公共程序集)中创建两个类MethodAHandlerMethodBHandler,然后您可以使用类似的内容:

using MethodHandlers;  // contains the two method handlers

public class ServiceA : IServiceA
{
   public void Method_A()
   {
       MethodAHandler hnd = new MethodAHandler();
       hnd.HandleMethodCall();
   }

   public void Method_B()
   {
       MethodBHandler hnd = new MethodBHandler();
       hnd.HandleMethodCall();
   }

   public void Method_X1()
   {
       // handle method X1 call here or delegate to another handler class
   }
}

和第二项服务:

using MethodHandlers;  // contains the two method handlers

public class ServiceB : IServiceB
{
   public void Method_A()
   {
       MethodAHandler hnd = new MethodAHandler();
       hnd.HandleMethodCall();
   }

   public void Method_B()
   {
       MethodBHandler hnd = new MethodBHandler();
       hnd.HandleMethodCall();
   }

   public void Method_X2()
   {
       // handle method X2 call here or delegate to another handler class
   }
}

在服务器端,您拥有.NET类,并且您可以通过公共类库或任何您认为最适合您的方法在两个单独的服务实现之间共享代码。