1

クラス MyClass があるとします。私のコードの一部では、次のようなものが必要です。

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

次に、別の場所 (ファイル/プロジェクト/時間) に次のようなものがあります。

Observable.Publish(instanceOfMyClass);

この 2 行目は、その正確なクラス タイプでサブスクライブされたすべてのメソッドをトリガーします。これは Reactive Extensions (v1 または v2) がサポートするものですか?

Subscribe 呼び出しの一部として SynchronizationContext を指定すると便利です。メソッドを WeakReference で保持する必要があるかどうかを指定することもできます。また、Publish メソッドには、すべてを同期的に実行する機能、または待機できる何かを提供する機能が必要です。

4

2 に答える 2

3

これを作成するのは難しいことではありません。

内部が必要であり、それを使用してそれぞれを(オブジェクトとして)によってDictionary<Type, Object>格納します。Subject<T>Type

Subscribe次に、2つのメソッドとメソッドを記述してPublish、内部ディクショナリを処理します。

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


単純だと言うのではなく、やってみようと思いました。

これが私のRxPub/Subクラスです。

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コンソールにのみ書き込みます。

楽しみ!

于 2012-04-19T03:34:19.653 に答える
3

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

于 2012-04-18T23:34:18.973 に答える