10

Tôi hiểu IObservable & IObserver là triển khai mẫu quan sát và có thể được sử dụng trong các trường hợp tương tự với các sự kiện .Net.IObservable <T> và INotifyPropertyChanged - có kết nối

Tôi đã tự hỏi liệu có bất kỳ mối quan hệ nào với INotifyPropertyChanged không?

Tôi hiện đang sử dụng INotifyPropertyChanged để liên kết dữ liệu trong winforms & các ứng dụng WPF và tự hỏi liệu tôi có thể sử dụng IObservable trong các tình huống ràng buộc dữ liệu giao diện người dùng không?

Cheers

AWC

Trả lời

3

Trừ WinForms và bindings WPF cũng hỗ trợ IObservable, nó sẽ không giúp đỡ để giữ cho giao diện người dùng được cập nhật với những thay đổi trong mô hình. Lý do mà bạn có thể sử dụng INotifyPropertyChanged là vì mã ràng buộc trong WinForms và WPF tìm giao diện này và khi được triển khai sử dụng sự kiện của nó để giữ cho giao diện người dùng được cập nhật.

+0

cảm ơn nhưng không thực sự hữu ích, tôi biết giao diện hoạt động như thế nào đối với ràng buộc – AwkwardCoder

+2

@AWC: Ngược lại, giải thích của anh ấy giải quyết các câu hỏi của bạn, đặc biệt là câu hỏi cuối cùng của bạn. –

+0

cho phép xem - Tôi nói rằng tôi đã sử dụng INotifyPropertyChanged vì vậy tôi sẽ có một số hiểu biết về cách hoạt động với Winforms \ WPF, tôi muốn biết về IObservable và liệu điều này có bất kỳ mẫu sử dụng nào trong Winforms \ WPF hay không câu hỏi. Vì vậy, không thực sự hữu ích là nó ... – AwkwardCoder

5

Từ những gì tôi có thể thu thập, không có mối quan hệ nào. Quan sát/.NET eventing là hai cách để đạt được hành vi kiểu Observer/Notification.

Câu trả lời của Microsoft đã được xây dựng trên mẫu .NET eventing, không được dùng nó để ủng hộ các đối tượng Observer đã đăng ký theo cách thủ công.

Một trong những mối quan tâm lớn nhất của tôi với sự kiện là không thể xóa chuỗi đại biểu theo yêu cầu, dẫn đến một số tình huống rò rỉ bộ nhớ được quản lý. Để kết thúc này, Microsoft đã giới thiệu khái niệm về các sự kiện yếu, có nghĩa là, để giải quyết vấn đề các mốc thời gian không phù hợp cho các Quan sát/Quan sát viên.

Bạn có thể đọc thêm về mẫu WeakEvent here.

Josh Smith đã phát hành một hàm của WeakEventManager cho INotifyPropertyChanged here. Điều này cung cấp một cách an toàn hơn (từ một bộ nhớ-quan điểm) cách kết nối các đối tượng thay đổi các thuộc tính và các Trình quan sát của chúng.

+0

Dự án MVVM Foundation có vẻ đã chết, không hoạt động nào trong 2,5 năm – BlackICE

1

Nếu bạn có ý nghĩa IObserver/IObservable theo quy định của các phần mở rộng Rx:

http://channel9.msdn.com/shows/Going+Deep/Kim-Hamilton-and-Wes-Dyer-Inside-NET-Rx-and-IObservableIObserver-in-the-BCL-VS-2010/

và:

http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html

Sau đó, táo và cam như nó.

INotifyPropertyChanged chỉ cung cấp một sự kiện phổ biến hookup cho databinding/etc để cho phép kiểm soát biết khi nào để cập nhật các giá trị ràng buộc của chúng.

IObservable/IObserver giống như "truy vấn với chuỗi sự kiện", nhưng thậm chí đó là mô tả kém.

Hmm ... ok, vì vậy bạn biết cách bạn có thể đặt nội dung vào "túi" này được gọi là bộ sưu tập và sau đó truy vấn bộ sưu tập đó (theo cách thủ công hoặc bằng câu lệnh LINQ) để lấy các giá trị, phải không? Đó là loại như thế, nhưng thay vì "kéo" dữ liệu ra khỏi một "túi", bạn đang nhận được sự kiện "đẩy" cho bạn.

Shameless plug có thể giúp hoặc nhầm lẫn hơn nữa: http://blog.lab49.com/archives/3252

2

Trước hết, tôi là một chút mới để Rx, vì vậy hãy bình luận của tôi cho phù hợp.

Điều đó nói rằng, tôi nghĩ rằng có một cơ hội tuyệt vời để hợp tác giữa INotifyPropertyChanged và Rx's IObservable. Tôi nghĩ tương đối rõ ràng rằng giao diện người dùng được xây dựng xung quanh INPC vào thời điểm này. Tuy nhiên, INPC cũng là một cách chính để phát hiện các thay đổi và quản lý các kịch bản trong đó mô hình miền hoặc mô hình xem có sự phụ thuộc lẫn nhau giữa các đối tượng và thuộc tính. Đó là những phụ thuộc lẫn nhau mà dường như là ứng cử viên tốt cho Rx.

Làm việc với INPC trực tiếp hơi phức tạp và hơi đau. Rất nhiều chuỗi ma thuật để giải quyết. Nó cũng là một chút đau đớn để xem cho một sự kiện trên một đối tượng nhiều cấp độ đi trong cây đối tượng.

Nhưng nếu tôi có thể lập mô hình các tương tác này "phản ứng", thì các kiểu xem và mô hình miền của tôi bắt đầu cảm thấy thanh lịch hơn một chút. Điều này là hiển nhiên trong sự tao nhã của các dự án như Bindable Linq, Continuous Linq, Obtics, v.v. Những thư viện này giúp đơn giản tạo "giá trị trực tiếp" hoặc "bộ sưu tập trực tiếp" tự động cập nhật (tôi có thể nói "phản ứng") để thay đổi. Linq liên tục thậm chí có "reactive object" framework để lập trình phản ứng, mặc dù không có Rx.

Dường như với tôi rằng sự phối hợp đến nếu chúng ta có thể sử dụng Rx để giữ mô hình và xem mô hình mạch lạc. Sau đó, chúng ta có thể làm cho "bề mặt có thể ràng buộc" của mô hình/mô hình xem tôn vinh INPC bằng cách tiếp tục tăng PropertyChanged khi cần thiết. Tôi đã nhìn thấy một cặp vợ chồng elegant extension methods mà sẽ tạo ra một quan sát từ INotifyPropertyChanged. Dường như nửa kia của điều này có thể là tạo ra một số cơ sở hạ tầng dịch từ Rx trở lại INPC.

+0

+1 Đây chính xác là những gì tôi dự định sẽ xem xét. Cũng nghiên cứu [ReactiveUI] (http://www.reactiveui.net/) – Benjol

Các vấn đề liên quan