using System; using Microsoft.Practices.Composite.Presentation.Events; namespace Microsoft.Practices.Composite.Events { public static class CompositePresentationEventExtensions { public static IObservable AsObservable(this CompositePresentationEvent @event) { return new CompositeEventObservable(@event); } } public class CompositePresentationEventObservable : IObservable { private readonly CompositePresentationEvent @event; public CompositePresentationEventObservable(CompositePresentationEvent @event) { if (@event == null) throw new ArgumentNullException("event"); this.@event = @event; } public IDisposable Subscribe(IObserver observer) { return new CompositePresentationEventSubscription(@event, observer); } } public class CompositePresentationEventSubscription : IDisposable { private readonly IObserver observer; private readonly CompositePresentationEvent @event; public CompositePresentationEventSubscription(CompositePresentationEvent @event, IObserver observer) { if (@event == null) throw new ArgumentNullException("event"); if (observer == null) throw new ArgumentNullException("observer"); this.@event = @event; this.observer = observer; @event.Subscribe(observer.OnNext); } protected virtual void Dispose(bool disposing) { if (disposing) { @event.Unsubscribe(observer.OnNext); } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } ~CompositePresentationEventSubscription() { Dispose(false); } } }