2016-10-08 1 views
1

特定のイベントに複数のサブスクライバが存在しないようにしたい。私の特別なケースでは、複数の加入者を持つことは理にかなっていませんし、そうであればいくつかの悪質な問題が発生する可能性があります。イベントに複数のサブスクライバが存在しないようにする

サイドノート:特に、私のハンドラー(サブスクライバー)はasyncでなければならず、イベントを起こすときにはawaitにしなければなりません。なぜなら、これはネットワークソケットラッピングクラスで、TextReceivedイベントを発生させ、ユーザ(サブスクライバ)が最後のTextReceivedイベントの処理を終了する前に、ソケットからそれ以上のデータを読み込みたくないからです。ユーザは通常、ソケットに何らかの応答を書き込み、複数の機内コールバックが衝突を引き起こします)。たぶん、このケースは別の方法(非同期イベントなし)で解決できる可能性があります。間違った問題を解決しようとしています。もしそうなら、どうですか?

これは私が思いついた解決策ですが、それが唯一の選択肢であるのか、それともさらに単純化できるのかは疑問です。

は、これは私のコードです:

private TextReceivedAsyncHandler _textReceivedAsync; 

    public event TextReceivedAsyncHandler TextReceivedAsync 
    { 
     add 
     { 
      if (_textReceivedAsync != null) 
       throw new MultipleSubscribersNotAllowedException(eventName: nameof(TextReceivedAsync)); 

      _textReceivedAsync = value; 
     } 
     remove 
     { 
      _textReceivedAsync = null; 
     } 
    } 

これは、複数の加入者を制限するための適切な最短の方法、またはあなたは、よりエレガントな解決策を提案することができますか?イベントの代わりにパブリックデリゲートプロパティを使用することを考えましたが、デリゲートがマルチキャストであるため問題は解決しません。

+0

私はあなたのアプローチに何か問題があるかわかりません。それ以上の制御が必要な場合は、オブザーバーパターンを自分で実装するか(非同期にするか)、代わりにコールバックプロパティを作成します(より少ないSOLID)。 –

答えて

3

私は依然として委任自体を公開することを提案します。はい、デリゲートはマルチキャストであり、それでも複数のメソッドを参照する可能性があります。しかし、セマンティクスのイベントは、複数のサブスクライバの可能性を前提としており、これを制限することはあなたのコードのユーザにとって非常に混乱します。しかし、デリゲートを公開すると、1人の「サブスクライバ」しか期待できません。 +=構文を使用しないようにするには、あなたはこのようにそれを行うことができます。

private Func<YourEventArgs, Task> _callback; 
public Func<YourEventArgs, Task> Callback 
{ 
    set { _callback = value; } 
} 

をこれは、ユーザーがまだ複数の方法でデリゲートを渡すかもしれないというのは本当です:

Func<YourEventArgs, Task> delegateA = ...; 
Func<YourEventArgs, Task> delegateB = ...; 
Callback = delegateA + delegateB; 

しかし、同じことは、あまりにもあなたのTextReceivedAsyncイベントのために真でありますそれは加入者自身の問題だと思う。あなたはが本当にがマルチキャストデリゲートを防ぎたい場合は

もう一つのオプションは、次のとおりです。

private Func<YourEventArgs, Task> _callback; 
public Func<YourEventArgs, Task> Callback 
{ 
    set 
    { 
     if (value != null && value.GetInvocationList().Length > 1) { 
      throw new Exception("..."); 
     } 
     _callback = value;     
    } 
} 
関連する問題