Я недавно читал об IObservable. До сих пор я смотрел различные вопросы SO и смотрел видео о том, что они могут делать. Весь механизм «толчка», о котором я думаю, блистателен, но я все еще пытаюсь понять, что именно все делает. Из моих чтений я думаю, что IObservable
- это то, что можно «наблюдать», а IObservers
- «наблюдатели».Использование IObservable вместо событий
Итак, теперь я стараюсь реализовать это в своем приложении. Есть несколько вещей, которые я бы хотел отключить, прежде чем начать. Я видел, что IObservable является противоположностью IEnumerable, однако я не могу видеть какие-либо места в моем конкретном экземпляре, которые я могу включить в свое приложение.
В настоящее время я активно использую события, так что я вижу, что «сантехника» начинает становиться неуправляемой. Я думаю, что IObservable может помочь мне здесь.
Рассмотрим следующую конструкцию, которая моя обертка вокруг моего ввода/вывода в моем приложении (FYI, я обычно приходится иметь дело со строками):
У меня есть базовый интерфейс называется IDataIO
:
public interface IDataIO
{
event OnDataReceived;
event OnTimeout:
event OnTransmit;
}
Теперь я в настоящее время есть три класса, которые реализуют этот интерфейс, каждый из этих классов в некотором роде использовать метод асинхронных вызовов, вводя некоторый тип многопоточной обработки:
public class SerialIO : IDataIO;
public class UdpIO : IDataIO;
public class TcpIO : IDataIO;
Существует один экземпляр каждого из этих классов, завернутых в мой последний класс, называемый IO (который также реализует IDataIO - придерживаясь моей шаблон стратегии):
public class IO : IDataIO
{
public SerialIO Serial;
public UdpIO Udp;
public TcpIO Tcp;
}
Я использовал шаблон стратегии инкапсулировать эти три класса, так что при изменении между различными экземплярами IDataIO
во время выполнения он становится «невидимым» для конечного пользователя. Как вы могли себе представить, это привело к тому, что на заднем плане появилось довольно много событий.
Итак, как я могу использовать уведомление «push» здесь в моем случае? Вместо того, чтобы подписываться на события (DataReceived и т. Д.), Я хотел бы просто подталкивать данные к любому, кого это интересует. Я немного не знаю, с чего начать. Я все еще пытаюсь играть с идеями/родовыми классами Subject
и различными воплощениями этого (ReplaySubject/AsynSubject/BehaviourSubject). Может кто-нибудь, пожалуйста, просветит меня на этом (возможно, со ссылкой на мой дизайн)? Или это просто не идеально подходит для IObservable
?
PS. Вы можете исправить любого из моих «недопониманий» :)
Hi RichK, могли бы вы подробнее остановиться на Subject собственности? Как это объявляется? И пользователь этого класса, как именно они «подписались» на IObservable 'DataReceived'. – Simon
@Simon Я сделал несколько изменений, дайте мне знать, если вы все еще не уверены :) – RichK
Спасибо, это очищает несколько вещей. Только 1 вещь, я предполагаю, что 'dataIo.DataObservable' является' public IObservable DataObservable'? –
Simon