2012-01-23 2 views
2

私は、T型のインスタンスを生成するファクトリメソッドを持っていて、ファクトリメソッドから発信されたすべてのインスタンスから起動されたイベントに対して、複数のインスタンスから起動されたイベントに対して、観測可能なシーケンスをマージする正しい方法

これを達成するための適切かつ最適な方法の下で、Merge()を使用していますか?

私はこれを静的イベントを使用して観測可能なシーケンスを作成することでしたが、一般的に静的イベントを使用するのは嫌いです。

答えて

2

虐待Mergeこのようなものはではありません。非常に効率的です。最も簡単な方法は、あなたが手でコントロールするIObservableであるSubjectを経由する方法です。

public static class MyAwesomeFooFactory 
{ 
    readonly static Subject<SomeEventArgs> someEvents = new Subject<SomeEventArgs>(); 

    public static IObservable<SomeEventArgs> NotificationsFromAllTheEvents { get { return someEvent; }} 

    public static Foo MakeANewFoo() 
    { 
     var ret = new Foo(); 
     ret.SomeEvent.Subscribe(someEvents); // NB: We never unsubscribe, *evar* 

     return ret; 
    } 
} 
+0

見栄えは良いですが、イベントの拡張子.Subscribe()、その名前空間やアセンブリは何ですか?私はSystem.Reactive v.1.0.10621.0とランタイムv.4.0.30319を使用しています –

+0

イベントに登録することはできません、私はFooにIObservable を返すSomeEventというプロパティがあると仮定していました。あなたが実際にラップしているものなら、単にObservable.FromEventを返すSomeEventプロパティを書くことができます –

1

あなたが望むように動作する可能性は低く、スタックの重大なパフォーマンスの問題が発生する可能性があります。追加するすべてのインスタンスに対して、最初のインスタンスと最終オブザーバの間のスタックに別のコールを追加します。あまりにも多くのインスタンスを取得し、スタックを吹くことができます。

潜在的に間違った機能がもっと重要です。オブザーバーは、サブスクライブ後にすべてのFooから通知を受け取る予定ですか?あなたの現在のデザインではそうはなりません。通知が必要な場合はstreamSubject<EventArgs>に変更し、それぞれFooに登録する必要があります。サブジェクトは、オブザーバーがサブスクライブした後に作成されたインスタンスから、サブジェクトのすべてのサブスクライバがメッセージを取得するという利点を持つマージポイントとして機能します。

関連する問題