2

私が取り組んでいるプログラムは、wcfを使用してコールバックとサービスの両方を公開しています。基本的に、サービスが行うことは、単にいくつかの変数値を返すことです。コールバックに関しては、それらは単にそれらの変数を更新します。

サービスのみを含む1つのクラスと、サービスとコールバックを含む1つのクラスを公開できるようにしたいと思います。

例えば ​​:

[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
  }

};

サービスのみが必要な場合は、基本クラスを使用できます。ただし、コールバックをサブスクライブしてサービスを使用する場合は、ServiceAndCallbackClassを使用できます。

これは可能ですか?

4

1 に答える 1

2

私が見つけた1つの解決策:

2つのインターフェースを作成します。最初のサービスにはサービスのみが含まれ、2番目のサービスには最初のサービスから継承してコールバックが追加されます。

実装クラスは2つのインターフェースを実装します。

例 :

[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
};

そこから、2つのサービスを作成できます。1つは実装クラスに基づいており、もう1つは「ダミー」クラスに基づいています。各サービスは異なるインターフェースから作成されるため、異なるメソッドが公開されます。

于 2012-04-24T13:54:08.623 に答える