Có giao diện IObservable và IObserver trong .NET (cũng ở đây và đây ). Thật thú vị, việc triển khai cụ thể của IObserver không có tham chiếu trực tiếp đến IObservable. Nó không biết ai đã đăng ký. Nó chỉ có thể gọi người đăng ký. "Hãy kéo pin để hủy đăng ký."
chỉnh sửa: Người đăng ký thực hiện IDisposable
. Tôi nghĩ rằng, kế hoạch này đã được sử dụng để ngăn chặn vấn đề người nghe mất hiệu lực .
Hai điều không hoàn toàn rõ ràng với tôi, mặc dù.
- Có phải lớp Unsubscacker bên trong cung cấp hành vi đăng ký và quên? Ai (và khi chính xác) gọi
IDisposable.Dispose()
cho Unsubscacker? Công cụ thu gom rác (GC) không mang tính quyết định.
[Tuyên bố miễn trừ trách nhiệm: nói chung, tôi đã dành nhiều thời gian với C và C ++ hơn so với C #.] Điều gì sẽ xảy ra nếu tôi muốn đăng ký một người quan sát K đến một L1 có thể quan sát được và người quan sát đã đăng ký một số L2 có thể quan sát khác?
K.Subscribe(L1); K.Subscribe(L2); K.Unsubscribe(); L1.PublishObservation(1003); L2.PublishObservation(1004);
Khi tôi chạy mã kiểm tra này với ví dụ của MSDN, người quan sát vẫn đăng ký L1. Đây sẽ là đặc thù trong phát triển thực sự. Có khả năng, có 3 con đường để cải thiện điều này:
- Nếu người quan sát đã có một cá thể người đăng ký (nghĩa là nó đã được đăng ký), thì nó lặng lẽ hủy đăng ký từ nhà cung cấp ban đầu trước khi đăng ký một cái mới. Cách tiếp cận này che giấu thực tế rằng nó không còn đăng ký vào nhà cung cấp ban đầu, điều này có thể trở thành một bất ngờ sau này.
- Nếu người quan sát đã có một cá thể người đăng ký, thì đó là một ngoại lệ. Một mã gọi hành xử tốt phải hủy đăng ký người quan sát một cách rõ ràng.
- Người quan sát đăng ký vào nhiều nhà cung cấp. Đây là tùy chọn hấp dẫn nhất, nhưng điều này có thể được thực hiện với IObservable và IObserver không? Hãy xem nào. Người quan sát có thể giữ một danh sách các đối tượng người đăng ký: một cho mỗi nguồn. Thật không may,
IObserver.OnComplete()
không cung cấp một tài liệu tham khảo lại cho nhà cung cấp đã gửi nó. Vì vậy, việc triển khai IObserver với nhiều nhà cung cấp sẽ không thể xác định được ai sẽ hủy đăng ký.
Có phải IObserver của .NET dự định đăng ký nhiều IObservables không?
Có phải định nghĩa sách giáo khoa về mẫu người quan sát yêu cầu một người quan sát phải có thể đăng ký vào nhiều nhà cung cấp không? Hoặc là tùy chọn và phụ thuộc vào việc thực hiện?