1

我正在尝试在一个类中设置一个可观察对象,该类将在每次事件触发成员时打勾。

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,并将 observable 视为一个事件参数流,无论在创建订阅后调用 OccursSomeTimeAfterFooServiceCreation 多少次。

4

2 回答 2

0

问题是您没有观察到类或变量。你观察实例。

如果我理解正确,您希望您的订阅者忘记观察到的实例发生变化的事实。

尝试这样的事情:

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);
  }
}
于 2018-11-12T23:43:35.240 回答
0

如果你的 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());
        }
    }
于 2018-11-14T13:20:08.837 回答