在属性更改时调用 OnNext



我想我在这里很密集。我有两个类,其中一个包含另一个类的列表 - 这是一个精简版本:

Class Service
  Private _ratesList As New List(Of Rate)
  Public Property Rates As IEnumerable(Of Rate)
  Public Sub AddRate(rate As Rate)
    _ratesList.Add(rate)
  End Sub
End Class
Class Rate        
  Private _priority As Integer
  Public Property Priority As Integer
    Get
      Return _priority
    End Get
    Set(ByVal Value As Integer)
      _priority = Value
    End Set
  End Property  
End Class

我需要在其列表中的某个 Rate 对象更改其优先级时通知父服务对象。以下内容可以满足我的需求:

Class Service
  Private _ratesList As New List(Of Rate)
  Public Property Rates As IEnumerable(Of Rate)
  Public Sub AddRate(rate As Rate)
    rate.PriorityChanges.Subscribe(AddressOf HandleRatePriorityChange)
    _ratesList.Add(rate)
  End Sub
  Private Sub HandleRatePriorityChange(rate As Rate)
    ' Do something
  End Sub
End Class
Class Rate        
  Private _priorityChanges As New Subject(Of Rate)
  Public ReadOnly Property PriorityChanges As IObservable(Of Rate)
    Get
      Return _priorityChanges
    End Get
  End Property
  Private _priority As Integer
  Public Property Priority As Integer
    Get
      Return _priority
    End Get
    Set(ByVal Value As Integer)
      _priority = Value
      _priorityChanges.OnNext(Me)
    End Set
  End Property  
End Class

因此,每次将属性设置为新值时,费率类都会调用 OnNext。

担心的是我使用的是主题而不是(例如)Observable.Create。推荐的方法是什么?我敢肯定这是显而易见的,但我已经达到了我看不到树木的木头的状态!

感谢戴夫·塞克斯顿(Dave Sexton)非常翔实的博客文章《使用主题还是不使用主题》。答案是,在这些特定情况下,我对使用Subject的担忧是错误的,但请阅读博客以获取更多信息

在你的情况下,使用BehaviorSubject可能是最简单的设计来让你达到你的目标(正如布兰登所建议的那样)。在这种情况下,这看起来像是赢家。

在设计或体系结构的更广泛视图中,您可能需要考虑用于传播更改通知的现有事件模式。INotifyPropertyChanged 接口和ObservableCollection(Of T)提供事件以公开更改通知。它们在 WPF 中非常流行,但它们存在于 BCL 中,因此可以在非 wpf 应用程序中使用。

如果您选择采用这些,则可以使用 FromEvent 工厂过渡到 Rx,大多数人将其包装在自定义扩展方法中。然而,在上面的简单示例中,这将是更多的代码,没有真正的收益。在更广泛的代码库中,这可能很有用,特别是如果你在 WPF 中,或者如果你使用像 Fody 这样的编织者来自动引发事件。

作为总的旁注,如果您还公开了删除或清除项目的方法,请记住处置您的订阅。我看到在您的示例中,您删除了返回的订阅。

相关内容

  • 没有找到相关文章

最新更新