.NET 에는 IObservable 및 IObserver 인터페이스가 있습니다 ( 여기 및 여기 ). 흥미롭게도 IObserver의 구체적인 구현은 IObservable에 대한 직접적인 참조를 보유하지 않습니다. 누가 구독했는지 알 수 없습니다. 구독자 만 호출 할 수 있습니다. "핀을 당겨서 탈퇴하십시오."
편집 : 탈퇴자는을 구현합니다 IDisposable
. 나는이 체계가 리스너 문제 를 방지하기 위해 사용되었다고 생각한다 .
그래도 두 가지가 완전히 명확하지 않습니다.
- 내부 Unsubscriber 클래스는 구독 및 잊어 버림 동작을 제공합니까? 구독자를 누가 (그리고 언제 정확하게) 호출
IDisposable.Dispose()
합니까? 가비지 콜렉터 (GC)는 결정적이지 않습니다.
[면책 조항 : 전반적으로 C #보다 C 및 C ++에서 더 많은 시간을 보냈습니다.] 옵저버 K를 옵저버 블 L1에 구독하고 옵저버가 다른 옵저버 블 L2를 구독 한 경우 어떻게됩니까?
K.Subscribe(L1); K.Subscribe(L2); K.Unsubscribe(); L1.PublishObservation(1003); L2.PublishObservation(1004);
MSDN의 예제에 대해이 테스트 코드를 실행했을 때 관찰자는 L1을 구독 한 상태로 유지되었습니다. 이것은 실제 개발에 독특 할 것입니다. 잠재적으로이를 개선하기위한 3 가지 방법이 있습니다.
- 옵저버에 구독자 인스턴스가 이미있는 경우 (즉, 이미 구독 한 경우) 새 제공자를 구독하기 전에 원래 제공자로부터 조용히 구독을 취소합니다. 이 접근 방식은 더 이상 원래 공급자를 구독하지 않아 나중에 놀랍게 될 수 있다는 사실을 숨 깁니다.
- 옵저버에 구독자 인스턴스가 이미 있으면 예외가 발생합니다. 올바르게 작동하는 호출 코드는 관찰자를 명시 적으로 구독 취소해야합니다.
- 관찰자는 여러 공급자를 구독합니다. 이것이 가장 흥미로운 옵션이지만 IObservable 및 IObserver로 구현할 수 있습니까? 보자 관찰자는 구독자 오브젝트 목록을 각 소스마다 하나씩 유지할 수 있습니다. 불행히도,
IObserver.OnComplete()
그것을 보낸 제공자에게 참조를 제공하지 않습니다. 따라서 여러 공급자를 사용한 IObserver 구현은 어느 공급자를 구독 취소할지 결정할 수 없습니다.
.NET의 IObserver는 여러 IObservable을 구독하기위한 것입니까?
옵저버 패턴의 교재 정의는 한 옵저버가 여러 제공자를 구독 할 수 있어야합니까? 아니면 선택적이고 구현에 따라 다릅니 까?