Скажем, у меня есть фабричный метод, который производит экземпляры типа T, и я хочу, чтобы наблюдаемая последовательность Rx для событий, запущенных из всех моих экземпляров, происходящих из фабричного метода.
Использует ли Merge (), как я сделал ниже, правильный и оптимальный способ достижения этого?
Другой способ, которым я это сделал, - использовать статическое событие и сделать из него наблюдаемую последовательность, однако мне обычно не нравится использовать статические события, и мне любопытно, что по мнению экспертов Rx будет оптимальным в этомситуация?
public T MakeFoo<T>() where T: Foo, new()
{
this.instanceOfObservable.Merge(new T());
return self;
}
public class ObservableSequence : IObservable<EventArgs>, IDisposable
{
private IObservable<EventArgs> stream;
public ObservableSequence()
{
}
// this method is called in the factory method for each new instance of T
public void Merge(Foo instance)
{
if (this.stream == null)
{
this.stream = Init(instance);
}
else
{
IObservable<EventArgs> next = Init(instance);
this.stream.Merge(next);
}
}
private IObservable<EventArgs> Init(Foo instance)
{
return Observable.FromEvent
<EventHandler<EventArgs>, EventArgs>(handler =>
{
EventHandler<EventArgs> eh = (sender, e) => {
handler(e);
};
return eh;
},
eh => instance.SomeEvent += eh ,
eh => instance.SomeEvent -= eh )
.Repeat()
.Retry()
.Publish()
.RefCount();
}
public void Dispose()
{
}
public IDisposable Subscribe(IObserver<EventArgs> observer)
{
return stream.Subscribe(observer);
}
}