Supongo que controlas la clase Foo, ya que estás hablando de agregarle un evento como una opción. Como usted es propietario de la clase, ¿hay alguna razón por la que no pueda definir su propia implementación IObservable para el método Do?
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;
}
}
Su clase tiene ahora una propiedad Observable<String>
que proporciona una forma de suscribirse a los valores devueltos por el método 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.
no he incursionado demasiado en el marco reactiva, pero piensa que esto es parecido a cómo harías esto.
Si esto es lo que realmente está buscando, al menos debe proteger su estado interno cambiando una línea a public IObservable DoValues {get {return _doValues.AsObservable(); }}. Esto evitará que los consumidores vuelvan a colocar su IObservable en un objeto y luego en sus propios valores. :( –