17

假设我们有一个类:

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

我想创建一个由Do方法产生的值的可观察值。一种方法是创建一个从Do调用的事件并使用Observable.FromEvent来创建 observable。但不知何故,我对仅仅为了任务而创建一个事件感觉不好。有更好的方法吗?

4

5 回答 5

9

马特的回答让我想到了这一点:

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-04T06:05:09.503 回答
1

我假设您控制 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.

我没有过多地涉足响应式框架,但我认为这与你将如何做到这一点很接近。

于 2010-02-04T05:15:44.670 回答
0

通常,您希望避免使用主题。根据我的经验,这表明您做错了什么。Observable.Create 或 Generate 通常更合适。

我很想看看您实际尝试做什么,看看我们是否可以提供更好的答案。李

于 2012-02-13T18:01:58.797 回答
0

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
  );

在实践中,您经常确实想要跟踪一些状态并有一些终止条件。生成使它变得容易。

于 2016-09-30T17:50:42.160 回答
-2

我会看看 EventAggregator 模型。有一篇很棒的文章,其中包含示例代码,展示了 StructureMap 的实现。

http://www.codeproject.com/KB/architecture/event_aggregator.aspx

于 2010-02-05T14:39:07.783 回答