クラスがあるとしましょう:
public class Foo
{
public string Do(int param)
{
}
}
Doメソッドによって生成される値のオブザーバブルを作成したいと思います。これを行う 1 つの方法は、 Doから呼び出されるイベントを作成し、 Observable.FromEventを使用してオブザーバブルを作成することです。でも、仕事のためだけにイベントを作るのは、なんとなく気分が悪い。それを行うより良い方法はありますか?
クラスがあるとしましょう:
public class Foo
{
public string Do(int param)
{
}
}
Doメソッドによって生成される値のオブザーバブルを作成したいと思います。これを行う 1 つの方法は、 Doから呼び出されるイベントを作成し、 Observable.FromEventを使用してオブザーバブルを作成することです。でも、仕事のためだけにイベントを作るのは、なんとなく気分が悪い。それを行うより良い方法はありますか?
マットの答えは私にこれについて考えさせました:
public class Foo
{
private readonly Subject<string> _doValues = new Subject<string>();
public IObservable<string> DoValues { get { return _doValues; } }
public string Do(int param)
{
var ret = (param * 2).ToString();
_doValues.OnNext(ret);
return ret;
}
}
var foo = new Foo();
foo.DoValues.Subscribe(Console.WriteLine);
foo.Do(2);
1 つのオプションとして Foo クラスにイベントを追加することについて話しているため、Foo クラスを制御していると想定しています。クラスを所有しているので、Do メソッドの独自の IObservable 実装を定義できない理由はありますか?
public class Foo
{
DoObservable _doValues = new DoObservable();
public IObservable<String> DoValues
{
return _doValues;
}
public string Do(int param)
{
string result;
// whatever
_doValues.Notify(result);
}
}
public class DoObservable : IObservable<String>
{
List<IObserver<String>> _observers = new List<IObserver<String>>();
public void Notify(string s)
{
foreach (var obs in _observers) obs.OnNext(s);
}
public IObserver<String> Subscribe(IObserver<String> observer)
{
_observers.Add(observer);
return observer;
}
}
Observable<String>
Do メソッドから返された値をサブスクライブする方法を提供するプロパティがクラスに追加されました。
public class StringWriter : IObserver<String>
{
public void OnNext(string value)
{
Console.WriteLine("Do returned " + value);
}
// and the other IObserver<String> methods
}
var subscriber = myFooInstance.DoValues.Subscribe(new StringWriter());
// from now on, anytime myFooInstance.Do() is called, the value it
// returns will be written to the console by the StringWriter observer.
私はリアクティブ フレームワークにあまり手を出していませんが、これはあなたがこれを行う方法に近いと思います。
通常、サブジェクトの使用は避けたいと思います。私の経験では、それはあなたが何か間違ったことをしている兆候です。通常、Observable.CreateまたはおそらくGenerateの方が適しています。
より良い答えを提供できるかどうかを確認するために、あなたが実際に何をしようとしているのかを知りたいと思います。リー
Observable.Generate は問題を解決しますが、サンプルに条件と続行を使用する必要はありません。これはオブジェクトを作成し、DoIt() への呼び出しの結果を継続的に返すだけです。
Observable.Generate (
new Foo(),
item => true, // in your example, this never terminates
item => item, // we don't actually do any state transitions
item => { return item.DoIt(); } // This is where we emit our value
);
実際には、いくつかの状態を追跡し、いくつかの終了条件を設定したいことがよくあります。生成すると簡単になります。
EventAggregatorモデルを見てみましょう。StructureMapを使用した実装を示すサンプルコードを含むすばらしい記事があります。
http://www.codeproject.com/KB/architecture/event_aggregator.aspx