Gần đây tôi đã đọc về IObservable. Cho đến nay, tôi đã xem xét các câu hỏi SO khác nhau và xem video về những gì họ có thể làm. Toàn bộ cơ chế "đẩy" tôi nghĩ là rực rỡ, nhưng tôi vẫn đang cố gắng tìm ra chính xác mọi thứ. Từ các bài đọc của tôi, tôi đoán theo cách một số IObservable
là thứ có thể được 'theo dõi' và IObservers
là 'người theo dõi'.Sử dụng IObservable thay vì các sự kiện
Vì vậy, bây giờ tôi đang cố gắng thực hiện điều này trong ứng dụng của mình. Có một vài điều tôi muốn giải quyết trước khi tôi bắt đầu. Tôi đã thấy rằng IObservable là đối diện của IEnumerable, tuy nhiên, tôi không thể thực sự nhìn thấy bất kỳ nơi nào trong trường hợp cụ thể của tôi mà tôi có thể kết hợp vào ứng dụng của tôi.
Hiện tại, tôi sử dụng nhiều sự kiện, rất nhiều thứ mà tôi có thể thấy 'hệ thống ống nước' đang bắt đầu trở nên không thể quản lý được. Tôi nghĩ, IObservable có thể giúp tôi ở đây.
Hãy xem xét các thiết kế dưới đây, gọi là wrapper của tôi xung quanh tôi tôi/O trong ứng dụng của tôi (FYI, tôi thường phải đối phó với chuỗi):
Tôi có một giao diện cơ sở được gọi là IDataIO
:
public interface IDataIO
{
event OnDataReceived;
event OnTimeout:
event OnTransmit;
}
Hiện tại, tôi hiện có ba lớp triển khai giao diện này, mỗi lớp trong một số cách sử dụng các cuộc gọi phương thức Async, giới thiệu một số loại xử lý đa luồng:
public class SerialIO : IDataIO;
public class UdpIO : IDataIO;
public class TcpIO : IDataIO;
Có một trường hợp duy nhất của mỗi người trong các lớp học gói lên thành lớp cuối cùng của tôi, được gọi là IO (mà cũng thực hiện IDataIO - tôn trọng những mô hình chiến lược của tôi):
public class IO : IDataIO
{
public SerialIO Serial;
public UdpIO Udp;
public TcpIO Tcp;
}
Tôi đã sử dụng mô hình chiến lược để đóng gói các ba lớp, để khi thay đổi giữa các phiên bản IDataIO
khác nhau trong thời gian chạy, làm cho nó 'ẩn' đối với người dùng cuối. Như bạn có thể tưởng tượng, điều này đã dẫn đến khá một chút 'sự kiện ống nước' trong nền.
Vì vậy, làm cách nào tôi có thể sử dụng thông báo 'đẩy' ở đây trong trường hợp của tôi? Thay vì đăng ký các sự kiện (DataReceived etc) tôi muốn chỉ đơn giản là đẩy dữ liệu đến bất cứ ai quan tâm. Tôi là một chút không chắc chắn về nơi để bắt đầu. Tôi vẫn đang cố gắng để đồ chơi với các ý tưởng/lớp học chung của Subject
, và các hóa thân khác nhau này (ReplaySubject/AsynSubject/BehaviourSubject). Ai đó có thể xin vui lòng khai sáng cho tôi về điều này (có thể với tham chiếu đến thiết kế của tôi)? Hay đơn giản đây không phải là sự phù hợp lý tưởng cho IObservable
?
PS. Vui lòng chỉnh sửa bất kỳ 'hiểu lầm' nào của tôi :)
Hi RichK, bạn có thể xin hãy giải thích về quyền sở hữu Chủ đề? Điều này được tuyên bố như thế nào? Và người dùng của lớp này, làm thế nào chính xác họ sẽ 'đăng ký' với IObservable 'DataReceived'. – Simon
@Simon Tôi đã thực hiện một vài chỉnh sửa, cho tôi biết nếu bạn vẫn không chắc chắn :) – RichK
Cảm ơn, điều đó sẽ xóa một vài điều. Chỉ cần 1 điều, tôi giả sử 'dataIo.DataObservable' là' public IObservable DataObservable'? –
Simon