2012-04-18 5 views
1

MyClass 클래스가 있다고 가정 해 보겠습니다.Reactive Extensions를 통해 독자적으로 구독하거나 게시 할 수 있습니까?

이 두 번째 줄은 모든 방법을 트리거
Observable.Publish(instanceOfMyClass); 

:이 같은 뭔가를

Observable.Subscribe<MyClass>(myClass => DoSomething(myClass)); 

그런 다음 다른 장소 (파일/프로젝트/시간)에 : 내 코드의 한 부분에서 나는 이런 식으로 뭔가를 원하는 정확한 클래스 유형으로 구독 한 Reactive Extensions (v1 또는 v2)가 지원하는 기능입니까?

Subscribe 호출의 일부로 SynchronizationContext를 지정하는 것이 유용 할 것입니다. 메소드가 WeakReference로 유지되어야하는지 여부를 지정하는 것도 좋습니다. 그리고 Publish 메서드는 동 기적으로 모든 작업을 수행하거나 기다릴 수있는 기능을 제공해야합니다.

답변

3

이것은 어렵지 않습니다.

Dictionary<Type, Object> 만 있으면 Subject<T> (개체로)을 Type으로 저장하면됩니다.

그런 다음 두 개의 SubscribePublish 메서드를 작성하여 내부 사전을 처리 할 수 ​​있습니다.

사실 아주 간단해야합니다.


간단히 말하면 나는 그것을 줄 것이라고 생각했다.

여기 내 수신 팝/하위 클래스의 :

public static class RxPS 
{ 
    private static Dictionary<Type, object> _subjects 
     = new Dictionary<Type, object>(); 

    public static IDisposable Subscribe<T>(Action<T> observer) 
    { 
     lock(_subjects) 
     { 
      if (!_subjects.ContainsKey(typeof(T))) 
      { 
       _subjects.Add(typeof(T), new Subject<T>()); 
      } 
      return (_subjects[typeof(T)] as Subject<T>) 
       .Subscribe(observer); 
     } 
    } 

    public static void Publish<T>(T item) 
    { 
     lock(_subjects) 
     { 
      if (_subjects.ContainsKey(typeof(T))) 
      { 
       (_subjects[typeof(T)] as Subject<T>) 
        .OnNext(item); 
      } 
     } 
    } 
} 

그리고 이것은 그것을 사용하는 방법입니다 :

RxPS.Publish(1); 
var d = RxPS.Subscribe<int>(x => Console.WriteLine(x)); 
RxPS.Publish(2); 
d.Dispose(); 
RxPS.Publish(3); 

결과는이 코드는 콘솔 만에 2 쓰기 것입니다.

즐기십시오!

+0

"OnNext"나에게 설명해 주시겠습니까? 그것은 여러 가입자를 촉발시킬 것입니까? 그리고 "d"가 범위를 벗어나게되면 어떻게됩니까? 가비지 컬렉터가 '둥글게 될 것인가'가 될 때 처리 할 것인가? – Brannon

+0

'OnNext'를 호출하면 주관 관측 가능 시퀀스의 다음 값이 주어지며이 값은 해당 주체의 모든 구독자에게 전송됩니다. 'd'가 범위를 벗어나면 아무 일도 일어나지 않을 것입니다. GC는 변수를 수집하지만 'Dispose'를 호출하지 않으므로 구독을 취소하지 않습니다. 'Dispose '를 호출하는 것은 항상 프로그래머의 책임입니다. Rx의 경우, 구독을 조기에 취소하려는 경우, 즉 OnCompleted 또는 OnError가 자연스럽게 호출되기 전에 만 Dispose를 호출합니다. – Enigmativity

3

ReactiveUI의 MessageBus class과 같은 것을 찾고 있다고 생각합니다. 이 클래스는 Rx를 사용하여 기본적으로 Type => IObservables 사전 만 있으면 게시/구독 모델을 구현합니다.

+0

깨진 링크 : https://github.com/reactiveui/ReactiveUI/blob/master/ReactiveUI/MessageBus.cs –

+0

수정 됨! 고마워. –

관련 문제