Search code examples
wcfinheritanceservicecallbackservicecontract

Wcf service inheritance (Extend a service)


The program I am working on exposes both callbacks and services using wcf. Basically, what the services do is simply return some variables value. As for the callback, they simply update those variables.

I want to be able to expose one class containing only the services and one class containing the services and the callbacks.

For example :

[ServiceContract]
[ServiceBehavior(InstanceContextMode=InstanceContextMode::Single, ConcurrencyMode=ConcurrencyMode::Multiple)]
public ServiceClass
{
  [OperationContract]
  public int getValue()
  {
    return mValue;
  }

  protected static int mValue;

};

[ServiceContract]
[ServiceBehavior(InstanceContextMode=InstanceContextMode::Single, ConcurrencyMode=ConcurrencyMode::Multiple)]
public ServiceAndCallbackClass : ServiceClass
{
  [OperationContract]
  public bool subscribe()
  {
    // some subscribing stuff
  }

  public void MyCallback()
  {
    ++mValue;

    // Notify every subscriber with the new value
  }

};

If I want only the services, I can use the base class. However, if I want to subscribe to the callback and use the service, I can use ServiceAndCallbackClass.

Is this possible ?


Solution

  • One solution I found :

    Make 2 interfaces. The first one containing only the services and the second one inheriting from the first one and adding the callbacks.

    An implementation class would implement the 2 interfaces.

    Example :

    [ServiceContract]
    [ServiceKnownType(typeof(ICallback))]
    public interface IService
    {
      [OperationContract]
      int GetData();
    }
    
    [ServiceContract]
    public interface ICallback : IService
    {
      [OperationContract]
      public bool subscribe();
    }
    
    [ServiceBehavior(InstanceContextMode=InstanceContextMode::Single, ConcurrencyMode=ConcurrencyMode::Multiple)]
    public ServiceClass : IService, ICallback
    {
      public int getValue()
      {
        return mValue;
      }
    
      public bool subscribe()
      {
        // some subscribing stuff
      }
    
      public void myCallback()
      {
        ++mValue;
    
        // Notify every subscriber with the new value
      }    
    
      protected static int;
    };
    
    [ServiceBehavior(InstanceContextMode=InstanceContextMode::Single, ConcurrencyMode=ConcurrencyMode::Multiple)]
    public ServiceAndCallbackClass : ServiceClass
    {
      // Dummy implementation used to create second service
    };
    

    From there, we can create 2 services. One based on the implementation class and one based on the "Dummy" class. Each service would be created from a different interface and thus exposing different methods.