2015-01-26 5 views
1

나는 여기서 밀도가 높다고 생각합니다. 나는 다른 목록이 포함되어 있습니다 그 중 하나는 두 개의 클래스를 가지고 - 여기 삭감 버전입니다 : 그 목록에서 속도 개체 중 하나의 우선 순위가 변경 될 때마다 나는 통지하는 부모의 서비스 객체가 필요속성 변경시 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 

. 다음은 내가 원하는 것입니다 :

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 

따라서 rate 클래스는 속성이 새 값으로 설정 될 때마다 OnNext를 호출합니다.

내 관심사는 (예를 들어) Observable.Create 대신 Subject를 사용하고 있다는 것입니다. 이 작업을 수행하는 데 권장되는 방법은 무엇입니까? 나는 그것이 명백하게 명백하다라고 확신한다. 그러나 나는 내가 나무를 위해 나무를 볼 수없는 상태에 도착했다!

+2

내 블로그 게시물 [주제 사용 또는 사용하지 않기] (http://davesexton.com/blog/post/To-Use-Subject-Or-Not-To-Use-Subject)를 읽어보십시오. .aspx) –

+0

감사합니다. 매우 도움이됩니다. 제목과 같은 소리가가는 길입니다. 나는 당신이 당신의 포스트에서 언급 한 바로 그 의견과, 어떤 시점에서 주제가 열악한 성과로 다시 쓰여질 수도 있다는 제안에 연기되었습니다. –

+1

'Subject '이 성능 저하로 다시 작성되는 것에 대해 걱정할 필요가 없습니다. Rx 1.0에서는 팀이 성과보다는 정확성에 집중하고 있었기 때문에 잠금 장치를 사용하여 Rx ​​문법과 일련 번호가 지정된 알림을 보장했습니다. Rx 2.0을 통해 팀은 잠금을 제거하고 문법 제약을 완화하여 성능을 크게 향상 시켰으며 Rx에서도 비슷한 변화를 만들었습니다. 나는 그들이 다시 되돌아 갈 것을 의심한다. http://blogs.msdn.com/b/rxteam/archive/2012/03/12/reactive-extensions-v2-0-beta-available-now.aspx –

답변

0

그의 유익한 블로그 게시물 To Use Subject or Not To Use Subject에 대한 Dave Sexton에게 감사드립니다. 대답은 이러한 특정 상황에서 주제를 사용하는 것에 대한 나의 우려가 잘못 배치되었지만 자세한 정보는 블로그를 참조하십시오.

0

BehaviorSubject을 사용하는 경우 가장 단순한 디자인을 사용하는 것이 좋습니다 (Brandon). 이 경우 승자처럼 보입니다.

디자인이나 아키텍처 전반에 걸쳐 은 변경 알림 전파를위한 기존 이벤트 패턴을 고려할 수 있습니다. INotifyPropertyChanged 인터페이스와 ObservableCollection(Of T)은 변경 알림을 제공하는 이벤트를 제공합니다. 이들은 WPF에서 매우 인기가 있지만 BCL에 존재하므로 non-wpf 응용 프로그램에서도 사용할 수 있습니다.

이러한 옵션을 채택한 경우 대부분의 사용자가 사용자 정의 확장 메소드에서 랩핑하는 FromEvent 팩토리를 사용하여 Rx로 전환 할 수 있습니다. 위의 간단한 예제에서는 이것이 실제 이득이되지 않는 훨씬 더 많은 코드가 될 것입니다. WPF에 있거나 Fody와 같은 위버를 사용하여 이벤트를 자동으로 수행하는 경우 광범위한 코드베이스에서이 코드가 특히 유용 할 수 있습니다.

전체 메모로 을 삭제하거나 항목을 지우는 방법을 폭로하는 경우 구독을 처분하십시오. 귀하의 예에서는 반환 된 구독을 삭제합니다.

+0

고마워요. 이 경우에는 래치 할 기존 이벤트 모델이 없었습니다. 이것은 처음부터 Rx로 작성되었으며, 이벤트 패턴을 도입하여 이벤트 사용을 피할 수있었습니다. 우리는이 기술을 다른 영역에서 많이 사용했습니다. 또한 Rx 사이트에 대한 귀하의 소개가 매우 유용하다는 것을 알았습니다. 그런데 정말 고마워요! –

+0

반가워요. 완전성을 위해 해당 답변을 게시하는 것입니다 (이벤트를 이미 사용하고있는 경우). 귀하의 경우에는 Brandon의 접근법을 강력히 권장합니다. –

관련 문제