2012-04-18 11 views
1

クラスMyClassがあるとします。Reactive Extensionsを使って独立して購読/発行することはできますか?

はこの二行目は、すべてのメソッドをトリガー
Observable.Publish(instanceOfMyClass); 

:私はこのような何かを持っている

Observable.Subscribe<MyClass>(myClass => DoSomething(myClass)); 

その後別の場所(ファイル/プロジェクト/時間)で:自分のコードの一部では、私はこのような何かをしたいですその正確なクラスタイプで購読されていました。 Reactive Extensions(v1またはv2)がサポートしているのですか?

サブスクリプション呼び出しの一部としてSynchronizationContextを指定すると便利です。メソッドがWeakReferenceで保持されるべきかどうかを指定するのも良いでしょう。そして、Publishメソッドは、すべてを同期して実行するか、私が待つことができる何かを与える能力を持っている必要があります。

答えて

3

これは作成するのが難しくありません。

内部にはDictionary<Type, Object>が必要で、Subject<T>(オブジェクトとして)をTypeで保存するだけです。

SubscribePublishの2つのメソッドを書き込んで、内部ディクショナリを処理できます。

実際には非常に簡単なはずです。


単なる単純なことではなく、私はそれをやり遂げると思った。

ここに私のRxパブ/サブクラスです:

public static class RxPS 
{ 
    private static Dictionary<Type, object> _subjects 
     = new Dictionary<Type, object>(); 

    public static IDisposable Subscribe<T>(Action<T> observer) 
    { 
     lock(_subjects) 
     { 
      if (!_subjects.ContainsKey(typeof(T))) 
      { 
       _subjects.Add(typeof(T), new Subject<T>()); 
      } 
      return (_subjects[typeof(T)] as Subject<T>) 
       .Subscribe(observer); 
     } 
    } 

    public static void Publish<T>(T item) 
    { 
     lock(_subjects) 
     { 
      if (_subjects.ContainsKey(typeof(T))) 
      { 
       (_subjects[typeof(T)] as Subject<T>) 
        .OnNext(item); 
      } 
     } 
    } 
} 

そして、これは、それが使用されている方法です。

RxPS.Publish(1); 
var d = RxPS.Subscribe<int>(x => Console.WriteLine(x)); 
RxPS.Publish(2); 
d.Dispose(); 
RxPS.Publish(3); 

結果は、このコードが唯一のコンソールに2を書くということです。

お楽しみください!

+0

私に説明してください "OnNext"?それは複数の加入者を引き起こすでしょうか? "d"を範囲外にするとどうなりますか?ガベージコレクタが 'ラウンドするかどうか」が出ると処分されますか? – Brannon

+0

'OnNext'を呼び出すと、それ自身の観測可能なシーケンスの次の値が与えられ、この値はそのサブジェクトの任意の加入者に送信されます。 'd'を範囲外にしても何も起こりません。 GCは変数を収集しますが、決して「Dispose」を呼び出すことはありませんので、サブスクリプションをキャンセルしません。 'Dispose'を呼び出すことは、常にプログラマの責任です。 Rxの場合、早期に、つまりOnCompletedまたはOnErrorが自然に呼び出される前に、サブスクリプションをキャンセルする場合にのみ、Disposeを呼び出します。 – Enigmativity

3

ReactiveUIのMessageBus classのようなものを探していると思います。このクラスは、基本的にType => IObservablesのDictionaryを持つだけで、Rxを使用してパブリッシュ/サブスクライブモデルを実装します。

+0

壊れたリンク:https://github.com/reactiveui/ReactiveUI/blob/master/ReactiveUI/MessageBus.cs –

+0

修正済み!ありがとう.. –

関連する問題