假设我们有一个类:
public class Foo
{
public string Do(int param)
{
}
}
我想创建一个由Do方法产生的值的可观察值。一种方法是创建一个从Do调用的事件并使用Observable.FromEvent来创建 observable。但不知何故,我对仅仅为了任务而创建一个事件感觉不好。有更好的方法吗?
假设我们有一个类:
public class Foo
{
public string Do(int param)
{
}
}
我想创建一个由Do方法产生的值的可观察值。一种方法是创建一个从Do调用的事件并使用Observable.FromEvent来创建 observable。但不知何故,我对仅仅为了任务而创建一个事件感觉不好。有更好的方法吗?
马特的回答让我想到了这一点:
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);
我假设您控制 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.
我没有过多地涉足响应式框架,但我认为这与你将如何做到这一点很接近。
通常,您希望避免使用主题。根据我的经验,这表明您做错了什么。Observable.Create 或 Generate 通常更合适。
我很想看看您实际尝试做什么,看看我们是否可以提供更好的答案。李
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
);
在实践中,您经常确实想要跟踪一些状态并有一些终止条件。生成使它变得容易。
我会看看 EventAggregator 模型。有一篇很棒的文章,其中包含示例代码,展示了 StructureMap 的实现。
http://www.codeproject.com/KB/architecture/event_aggregator.aspx