我想我在这里很密集。我有两个类,其中一个包含另一个类的列表 - 这是一个精简版本:
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 这样的编织者来自动引发事件。
作为总的旁注,如果您还公开了删除或清除项目的方法,请记住处置您的订阅。我看到在您的示例中,您删除了返回的订阅。