重新实例化对象引发事件时可观察到 FromEventPattern
Observable FromEventPattern when object rasing events is reinstantiated
我正在尝试在 class 中设置一个 observable,它会在每次对成员触发事件时触发。
public class FooService
{
private BarProvider _barProvider;
public IObservable<BarChangedEventArgs> BarChanged { get; }
public FooService()
{
BarChanged =
Observable
.FromEventPattern<BarChangedHandler, BarChangedEventArgs>(
h => _barProvider.Changed += h,
h => _barProvider.Changed -= h)
.Select(p => p.EventArgs);
}
public void OccursSomeTimeAfterFooServiceCreation
(
Func<BarProvider> barProviderFactory
)
{
_barProvider = barProviderFactory();
}
}
我认为我需要做的是在 OccursLater 方法中分配新的 _barProvider 值后设置可观察的事件处理程序,因为这是一个新的事件源。但是,我相信在消费者可能已经订阅之后,稍后设置 BarChanged 会破坏那些现有的订阅。
我希望 FooService 的消费者能够随时订阅 BarChanged,并将可观察对象视为一个事件参数流,而不管在创建订阅后调用 OccursSomeTimeAfterFooServiceCreation 多少次。
问题是您没有观察到 类 或变量。你观察实例。
如果我理解正确的话,您希望您的订阅者忘记观察到的实例发生变化的事实。
尝试这样的事情:
public class FooService
{
private BarProvider _barProvider;
private Subject<BarChangedEventArgs> subject = new Subject<BarChangedEventArgs>();
public IObservable<BarChangedEventArgs> BarChanged { get; } = subject.AsObservable();
public FooService()
{
}
public void OccursSomeTimeAfterFooServiceCreation
(
Func<BarProvider> barProviderFactory
)
{
_barProvider = barProviderFactory();
BarChanged =
Observable
.FromEventPattern<BarChangedHandler, BarChangedEventArgs>(
h => _barProvider.Changed += h,
h => _barProvider.Changed -= h)
.Select(p => p.EventArgs)
.Subscribe(subject);
}
}
如果您的 Observable - 创建依赖于可以改变的东西,例如您的 barProvider,您应该始终从其他 Observable 中检索它们,然后使用 Switch() 运算符。
为此,我使用了 BehaviorSubject。
public class FooService
{
public BehaviorSubject<BarProvider> _barProviderSubject = new BehaviorSubject<BarProvider>(null); //or initialize this subject with the barprovider of your choice
public IObservable<BarChangedEventArgs> BarChanged { get; }
public FooService()
{
var barChangedChanged = _barProviderSubject.Where(bP => bP != null).Select(bP =>
Observable.FromEventPattern<BarChangedHandler, BarChangedEventArgs>(
h => bP.Changed += h,
h => bP.Changed -= h)
.Select(p => p.EventArgs)
);
BarChanged = barChangedChanged.Switch();
}
public void OccursSomeTimeAfterFooServiceCreation
(
Func<BarProvider> barProviderFactory
)
{
_barProviderSubject.OnNext(barProviderFactory());
}
}
我正在尝试在 class 中设置一个 observable,它会在每次对成员触发事件时触发。
public class FooService
{
private BarProvider _barProvider;
public IObservable<BarChangedEventArgs> BarChanged { get; }
public FooService()
{
BarChanged =
Observable
.FromEventPattern<BarChangedHandler, BarChangedEventArgs>(
h => _barProvider.Changed += h,
h => _barProvider.Changed -= h)
.Select(p => p.EventArgs);
}
public void OccursSomeTimeAfterFooServiceCreation
(
Func<BarProvider> barProviderFactory
)
{
_barProvider = barProviderFactory();
}
}
我认为我需要做的是在 OccursLater 方法中分配新的 _barProvider 值后设置可观察的事件处理程序,因为这是一个新的事件源。但是,我相信在消费者可能已经订阅之后,稍后设置 BarChanged 会破坏那些现有的订阅。
我希望 FooService 的消费者能够随时订阅 BarChanged,并将可观察对象视为一个事件参数流,而不管在创建订阅后调用 OccursSomeTimeAfterFooServiceCreation 多少次。
问题是您没有观察到 类 或变量。你观察实例。
如果我理解正确的话,您希望您的订阅者忘记观察到的实例发生变化的事实。
尝试这样的事情:
public class FooService
{
private BarProvider _barProvider;
private Subject<BarChangedEventArgs> subject = new Subject<BarChangedEventArgs>();
public IObservable<BarChangedEventArgs> BarChanged { get; } = subject.AsObservable();
public FooService()
{
}
public void OccursSomeTimeAfterFooServiceCreation
(
Func<BarProvider> barProviderFactory
)
{
_barProvider = barProviderFactory();
BarChanged =
Observable
.FromEventPattern<BarChangedHandler, BarChangedEventArgs>(
h => _barProvider.Changed += h,
h => _barProvider.Changed -= h)
.Select(p => p.EventArgs)
.Subscribe(subject);
}
}
如果您的 Observable - 创建依赖于可以改变的东西,例如您的 barProvider,您应该始终从其他 Observable 中检索它们,然后使用 Switch() 运算符。
为此,我使用了 BehaviorSubject。
public class FooService
{
public BehaviorSubject<BarProvider> _barProviderSubject = new BehaviorSubject<BarProvider>(null); //or initialize this subject with the barprovider of your choice
public IObservable<BarChangedEventArgs> BarChanged { get; }
public FooService()
{
var barChangedChanged = _barProviderSubject.Where(bP => bP != null).Select(bP =>
Observable.FromEventPattern<BarChangedHandler, BarChangedEventArgs>(
h => bP.Changed += h,
h => bP.Changed -= h)
.Select(p => p.EventArgs)
);
BarChanged = barChangedChanged.Switch();
}
public void OccursSomeTimeAfterFooServiceCreation
(
Func<BarProvider> barProviderFactory
)
{
_barProviderSubject.OnNext(barProviderFactory());
}
}