2

モデルがビュー(フォーム)から非同期(backgroundWorkerスレッド)で実行されているMVCパターンが実装されたWinFormsアプリがあります。ビューは、モデルから発生するいくつかのイベントにサブスクライブされます。

次に、これをWCFアプリに変換する必要があります。このアプリでは、event-eventHandlerの概念が存在する必要があります。
最初はコールバックインターフェイスを介してこれを実装したかったのですが、私の場合、Modelの1つのメソッドが複数のタイプのイベントを発生させ、サービスコントラクトを定義するときに単一のコールバックインターフェイスの使用に制限されています。

この時点で、コールバックサービスのメソッドとしてさまざまなタイプのイベントを指定し、それをクライアントに実装するというアイデアを思いつきました。例えば:

public interface ICallbacks
{
  [OperationContract(IsOneWay = true)]
  void EventHandler1();

  [OperationContract(IsOneWay = true)]
  void EventHandler2(string callbackValue);

  [OperationContract(IsOneWay = true)]
  void EventHandler3(string callbackValue);
}

このソリューションを使用する必要がありますか、それともいくつかのより良い代替手段(publish-subscribe wcfパターン)がありますか?

4

3 に答える 3

0

基本タイプパラメータを指定した単一のメソッドを使用して、呼び出しをアクティブ化できます。次に、サービスコードで、イベントのタイプに基づいて特定のハンドラーにジャンプします。

public class BaseEvent { }

public class MyFirstEvent : BaseEvent { }

public class MySecondEvent : BaseEvent { }

public class MyThirdEvent : BaseEvent { }


public interface ICallbacks
{
  [OperationContract(IsOneWay = true)]
  void EventHandler(BaseEvent myEvent);
}

public class MyService : ICallbacks
{
   public void EventHandler(BaseEvent myEvent)
   {
      //Now you can check for the concrete type of myEvent and jump to specific method.
      //e.g.: 
      if (myEvent is MyFirstEvent)
      {
         //Call your handler here.
      }


      //Another approach can be predefined dictionary map of your event handlers
      //You want to define this as static map in class scope, 
      //not necessarily within this method.
      Dictionary<Type, string> map = new Dictionary<Type, string>()
      {
         { typeof(MyFirstEvent), "MyFirstEventHandlerMethod" },
         { typeof(MySecondEvent), "MySecondEventHandlerMethod" }
         { typeof(MyThridEvent), "MyThirdEventHandlerMethod" }
      };

      //Get method name from the map and invoke it.
      var targetMethod = map[myEvent.GetType()];
      this.GetType().GetMethod(targetMethod).Invoke(myEvent);
   }
}
于 2012-06-26T14:35:21.273 に答える
0

アプリケーションが少なくとも同じネットワーク上で同じ上で実行され、干渉するプロキシなどが存在しない場合を除き、デュプレックスを使用することはお勧めできません。また、パブリッシャーとサブスクライバーの間の密結合も発生します。

于 2012-06-26T15:26:01.983 に答える
0

ここでは、pub/sub アーキテクチャが絶対に必要なようです。

この MSDN 記事から Juval Lowy の Publish-Subscribe Framework をご覧ください: http://msdn.microsoft.com/en-us/magazine/cc163537.aspx

于 2012-06-26T14:28:20.443 に答える