让我们说,我们有一个类:

public class Foo
{
   public string Do(int param)
   {
   }
}

我想创建一个可观察正在由的待办事项方式产生的值的。做到这一点的方法之一是创建它正在从不要并使用称为事件的 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);

其他提示

通常你要避免使用对象。在我的experiance它是你正在做的事情错了一个标志。 Observable.Create或也许生成通常是更好的拟合。

我很想看看你实际上是试图做的,看看我们是否可以提供一个更好的答案。 利

我假设你控制了Foo类,因为你在谈论添加事件,以它作为一个选项。因为你自己的班级,是没有任何理由不能定义为你的方法你自己的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>属性它提供了一种订阅从你的方法返回的值:

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.Generate解决您的问题,虽然你并不需要使用条件和继续为您的样品。这只是创建和对象,并连续地返回调用度特()的结果:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top