Прочитав msdn о Reactive Extensions и тому подобном, я нашел рекомендацию, в которой говорилось, что я не должен реализовывать IObservable, а использовать Observable.Create... К тому времени, когда я это прочитал, в моем проекте уже был класс ObservableImplementation<T>
, который я использовал в качестве источника IObservable, везде, где я хотел преобразовать события в Observables.
Я прочитал AbstractObservable<T>
реализацию в System.Reactive и не нашел существенной разницы между их кодом и моим. Так что же не так с реализацией 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(); } }
}