让我们说,我们有一个班级:
public class Foo
{
public string Do(int param)
{
}
}
我想创建一个由 Do 方法生成的值的可观察值。一种方法是创建一个从执行调用的事件,并使用 Observable.FromEvent 来创建observable。但不知何故,为了完成任务,我对创建一个事件并不感到满意。有没有更好的方法呢?
答案 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