为方法创建IObservable的好方法是什么?

时间:2010-02-04 04:54:00

标签: c# system.reactive

让我们说,我们有一个班级:

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

我想创建一个由 Do 方法生成的值的可观察值。一种方法是创建一个从执行调用的事件,并使用 Observable.FromEvent 来创建observable。但不知何故,为了完成任务,我对创建一个事件并不感到满意。有没有更好的方法呢?

5 个答案:

答案 0 :(得分:7)

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

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 :(得分: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.

我没有过多涉及反应框架,但我认为这与你如何做到这一点很接近。

答案 2 :(得分:1)

通常你想避免使用主题。在我的经验中,这表明你做错了什么。 Observable.Create或者Generate通常更适合。

我很想看看你究竟想做什么,看看我们是否能提供更好的答案。 利

答案 3 :(得分:0)

Observable.Generate解决了您的问题,尽管您不需要为样本使用条件和继续。这只是创建并对象并不断地将调用结果返回给DoIt():

<script type="text/javascript" src="http://code.jquery.com/jquery.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        $("button").click(function(){
            var sports = [];
            $.each($("input[name='sport']:checked"), function(){            
                 sports.push($(this).val());

            });
           $('#child').append(sports.join(", "));

        });
    });

</script>
    <form>
    <div id="main">
        <label><input type="checkbox" value="football" name="sport"> Football</label>

        <label><input type="checkbox" value="baseball" name="sport"> Baseball</label>

        <label><input type="checkbox" value="cricket" name="sport"> Cricket</label>

        <label><input type="checkbox" value="boxing" name="sport"> Boxing</label>

        <label><input type="checkbox" value="racing" name="sport"> Racing</label>

        <label><input type="checkbox" value="swimming" name="sport"> Swimming</label>

        <br>
    </div>
    <div id="child">

    </div>

        <button type="button">Get Values</button>

    </form>

实际上,您经常需要跟踪某些状态并有一些终止条件。生成使它变得容易。

答案 4 :(得分:-2)

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

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