Leggendo msdn sulle estensioni reattive e così, ho trovato una raccomandazione che dice che non dovrei implementare IObservable, piuttosto uso Observable.Create ... Nel momento in cui ho letto questo, il mio progetto aveva già una classe ObservableImplementation<T>
, che avevo usato come una sorgente IObservable, ovunque volessi trasformare gli eventi in Observables.Perché non dovrei implementare IObservable <T>?
Ho letto l'implementazione AbstractObservable<T>
in System.Reactive e non ho rilevato alcuna differenza importante tra il loro codice e il mio. Quindi cosa c'è di sbagliato nell'implementazione di IObservable? Posso aggiungere le mie proprietà, e così via ...
per pienezza, ecco la mia implementazione, per favore dimmi se ho fatto qualcosa di sbagliato!
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(); } }
}
Cordiali saluti, c'è già un'implementazione della classe concreta di 'IObservable ':' Subject' –
... anche un 'IDisposable' basato sui delegati può essere creato usando' Disposable.Create' –
Ho trovato il secondo e ho intenzione di sostituirlo, ma Subject è molto più di un semplice Observable implementazione, dal momento che è anche osservabile. No? – TDaver