Reactive Extensions などについて 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(); } }
}