मुझे लगता है कि आप फू क्लास को नियंत्रित करते हैं, क्योंकि आप इसे एक विकल्प के रूप में एक ईवेंट जोड़ने के बारे में बात कर रहे हैं। चूंकि आप कक्षा के मालिक हैं, क्या कोई कारण है कि आप अपनी विधि के लिए अपने स्वयं के 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.
मैं प्रतिक्रियाशील ढांचे में बहुत ज्यादा हाथ आजमाया नहीं गया है, लेकिन मैं लगता है कि यह इस बात के करीब है कि आप यह कैसे करेंगे।
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);
स्रोत
2010-02-04 05:15:44
यदि आप वास्तव में इसके लिए देख रहे हैं, तो आपको कम से कम एक पंक्ति को सार्वजनिक IObservable DoValues {get {return _doValues.AsObservable में बदलकर अपनी आंतरिक स्थिति की रक्षा करनी चाहिए(); }}। इससे उपभोक्ताओं को रोका जा सकता है, बस अपने IObservable को एक ISubject और OnNext- को अपने स्वयं के मानों में डालना होगा। :( –