Объединение нескольких источников событий в один IObservable с Rx

Это вопрос о том, как использовать реактивные расширения (Rx) в конкретном сценарии, связанном с событием.

  • Цель состоит в том, чтобы взять несколько классов, которые запускают какое-либо событие
  • , и собрать их в один IObservable , на который могут подписаться любые клиенты (не знающие о классах событий).
  • Обратите внимание на интересующие события используйте подклассы EventArgs

Некоторые настраиваемые EventArgs

public class HappenedEventArgs : EventArgs
{
    internal bool IsBadNotGood;
}

Многие отдельные классы, в которых произошли события

public class EventSourceA : IEventSource {

    public event HappenedEventHandler Happened;
    private void OnHappened(HappenedEventArgs e)
    {
        if (Happened != null)
            Happened(this, e);
    }
    // And then this class calls OnHappened(e) whenever it decides to ...
}

public class EventSourceB : IEventSource {

    public event HappenedEventHandler Happened;
    private void OnHappened(HappenedEventArgs e)
    {
        if (Happened != null)
            Happened(this, e);
    }
    // And then this class also calls OnHappened(e) at times ...
}

public interface IEventSource
{
    event HappenedEventHandler Happened;
}

public delegate void HappenedEventHandler(object sender, HappenedEventArgs e);

Как объединить все эти события и выявить единый фронт событий

public class Pooler{

    private IObservable<X> _pool;

    public IObservable<X> Subscribe(){
        return _pool;        
    }

    public void Register(IEventSource item)
    {
        // How to take item.Happened and inject/bind it into _pool here?
    }        

    internal void Unregister(IEventSource item)
    {
        // Disconnect item.Happened from _pool
    }

    public Pooler(){
        // Instantiate _pool to whatever is best?
        // _pool = ...
    }

 }

Подписчик Кто ничего не знает об источниках событий напрямую

 static void Try() {
     var pooler = new Pooler();
     pooler.Subscribe().Subscribe(e =>
            {
                 // Do something with events here, as they arrive
            }
     );
     // ....
     // Wherever whenever:
     AddEventSources(pooler);
 }

 static void AddEventSources(Pooler pooler){
     var eventSourceA = new EventSourceA();
     pooler.Register(eventSourceA);
     var eventSourceB = new EventSourceB();
     pooler.Register(eventSourceB);     
 }
9
задан Cel 19 November 2011 в 13:55
поделиться