Dies ist eine Frage über die Verwendung von Reactive Extensions (Rx) in einem bestimmten ereignisbezogenen Szenario.
- Das Ziel ist es, eine Reihe von Klassen zu nehmen, die ein Ereignis auslösen
- Und sie zu einem einzigen zusammenführen
IObservable
die von beliebigen Clients (die die Ereignisklassen nicht kennen) abonniert werden können. - Beachten Sie, dass die Ereignisse von Interesse subclassed verwenden
EventArgs
Einige benutzerdefinierte EventArgs
public class HappenedEventArgs : EventArgs
{
internal bool IsBadNotGood;
}
Viele getrennte Klassen, in denen sich Ereignisse ereignen
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);
Wie man all diese Ereignisse bündelt und eine einheitliche Veranstaltungsfront aufdeckt
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 = ...
}
}
Ein Abonnent, der nichts über EventSources weiß, direkt
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);
}