在阅读与反应式扩展相关的msdn文档时,我发现有一条建议说我不应该实现IObservable,而是应该使用Observable.Create...但在我看到这个建议的时候,我的项目已经有了一个ObservableImplementation<T>
类,我已经在想要将事件转换为Observables的任何地方使用它作为IObservable源。
我已经阅读了System.Reactive中的AbstractObservable<T>
实现,我没有发现他们的代码和我的代码之间有什么主要区别。那么实现IObservable有什么问题吗?我可以添加自己的属性等...
出于完整性的考虑,这里是我的实现,请告诉我是否做错了什么!
public sealed class ObservableImplementation<T> : IObservable<T>
{
class Subscription : IDisposable
{
private readonly Action _onDispose;
public Subscription(Action onDispose)
{
_onDispose = onDispose;
}
public void Dispose()
{
_onDispose();
}
}
public void Raise(T value)
{
_observers.ForEach(o => o.OnNext(value));
}
public void Completion()
{
_observers.ForEach(o => o.OnCompleted());
_observers.Clear();
}
private readonly List<IObserver<T>> _observers = new List<IObserver<T>>();
public IDisposable Subscribe(IObserver<T> observer)
{
var subscription = new Subscription(() => _observers.Remove(observer));
_observers.Add(observer);
return subscription;
}
public bool AnyObserverPresent { get { return _observers.Any(); } }
}