0

だから私が持っていると言います:

public interface SystemA
{
    void MethodA(string a, string b, int c);
}

そして私のアプリケーションのどこかで、

public class ClientA
{
    public SystemA mSystemA;
    public ClientA()
    {
         mSystemA.MethodA("whatever", "ok", 42);
    }
}

しかし、次の要件を満たすように変更する方法を見つけようとしています。

  1. システム上のメソッドへの呼び出しは、特定の応答を受け取る場合と受け取らない場合があります
  2. 応答を期待するメソッドは、メソッドの再呼び出し、クライアントへの通知、システムへの通知など、送信後に経過した時間に基づいてさまざまなアクションをトリガーする場合があります。
  3. クライアントもメッセージを受信できる必要があります
  4. システム(または受信クライアント)のインターフェースだけを変更する必要があることを望んでいます。
  5. 最小限のオーバーヘッド
  6. シングルトンは再利用性を損ない、緊密な結合を作成するため、避ける

具体的には、リモート リソースとのやり取りを担当する 3 つのシステム (多くのシステムのうち) があり、それらのインターフェイスへの呼び出しに対して応答が得られるかどうか、または応答がいつ得られるか、または応答が有効 - システム自体とそれらを使用するクライアントでこれらのケースを処理することは、動作を具体的に割り当てる状態であっても非常に複雑です。

私が試したり検討したりして気に入らないこと:

  • イベント システム - システムに公開する新しいメソッドごとに新しいイベントとリスナーを定義する必要があり、メソッドを変更するたびに、一致するすべてのイベント、すべてのリスナーなどを変更する必要があります。FAR もあります。それを使用すると多くのオーバーヘッドが発生します。指定したすべてのイベントに引数が必要だと指定すると、大量の作業が発生しますが、イベントを非常に一般的なものにすると、それらを一致させるために送信者と受信者の間を行ったり来たりする必要があります。
  • コマンド - レシーバーのメソッドごとに新しいコマンドを定義する必要があり、メソッドが依存するメソッドを変更するたびに、コマンドを変更する必要があります。それに加えて、すべてのコマンドのコンストラクターはメソッドのシグネチャと一致する必要があります。これでもオーバーヘッドが多すぎると思います。

考え?

4

1 に答える 1

1

あなたの要件を理解しているかどうかはわかりませんが(特に#1は私を混乱させます)、典型的な非同期クライアントサーバー通信メカニズムについて説明していると思います。

その場合は、メッセージ キューを検討してください。呼び出しと応答は、適切なクライアントまたはサーバー キューに配置されます。応答への呼び出しの関連付けは、ある種の Cookie または uid を介して行われます。クライアントは、リクエストを送信した時間と応答を受信した時間などを追跡できます。

これにはオーバーヘッドが伴いますか?確かにそうです。しかし、要件にオーバーヘッドが必要な場合、それは本当にオーバーヘッドでしょうか?

于 2012-08-03T15:02:02.047 に答える