Это вопрос о том, как использовать реактивные расширения (Rx) в конкретном сценарии, связанном с событием.
IObservable
, на который могут подписаться любые клиенты (не знающие о классах событий). 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);
}