Использование IObservable вместо событий

Недавно я читал об IObservable. посмотрел на различные вопросы SO и посмотрел видео о том, что они могут сделать. Весь механизм «толкания», как я думаю, великолепен, но я все еще пытаюсь понять, что именно все делает. Судя по моим чтениям, я предполагаю, что IObservable— это нечто, за чем можно «наблюдать», а IObserversявляются «наблюдателями».

Итак, теперь я пытаюсь реализовать это в своем приложении.Есть несколько вещей, которые я хотел бы выбросить, прежде чем я начну. Я видел, что IObservable является противоположностью IEnumerable, однако я не вижу никаких мест в моем конкретном экземпляре, которые я мог бы включить в свое приложение.

В настоящее время я так интенсивно использую события, что вижу, что «сантехника» становится неуправляемой. Я думаю, что IObservable может помочь мне здесь.

Рассмотрим следующий дизайн, который является моей оболочкой для моего ввода-вывода в моем приложении (к вашему сведению, мне обычно приходится иметь дело со строками):

У меня есть базовый интерфейс, который называется 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?

ПС. Не стесняйтесь исправлять любое мое «недоразумение» :)

9
задан Simon 25 June 2012 в 13:54
поделиться