Горячая наблюдаемая без субъекта

#.net #system.reactive #reactive-programming #subject

#.net #system.reactive #реактивное программирование #субъект

Вопрос:

Есть ли способ создать горячую наблюдаемую без использования темы? Например, для предоставления наблюдаемой в стиле события вы можете использовать тему:

 class MySouce
{
    private Subject<string> thingsSubject = new Subject<string>();
    public IObservable<string> ThingsThatHappen
    {
        get { return this.thingsSubject; }
    }

    private void OnThingHappening(string thing)
    {
        this.thingsSubject.OnNext(thing);
    }
}
 

Я не ненавижу это, но я не люблю использовать тему. Такое ощущение, что его использование создает дополнительные проблемы с управлением состоянием и временем жизни. Я знаю, что мог бы реализовать использование Observable.Create и просто отслеживание подписчиков, но это похоже на ту же проблему.

Есть ли более элегантное решение для этого или я просто педантичен, беспокоясь об этом в первую очередь?


Обновить

Причина, по которой я даже так много думал об этом в первую очередь. Недавно мне был предоставлен некоторый устаревший код с типами, которые содержат события, которые необходимо было удалить и заменить наблюдаемыми. Все эти события были настроены одинаково:

 public event EventHandler MyEvent { add; remove;}

protected void OnMyEvent() { ... }
 

А затем по всему этому типу разбросаны различные вызовы OnMyEvent() . Я передал его младшему разработчику и попросил их заменить события наблюдаемыми свойствами, поддерживаемыми объектами, и заставить Onxxx реализации передавать новое значение субъекту. С тех пор, однако, я как бы размышлял над этим и задавался вопросом, возможно ли другое решение, учитывая мое отвращение к темам в производственном коде.

Комментарии:

1. Обычно, если вы хотите использовать интерфейс, ему нужна реализация. Просто говорю.

2. Я знаю, что вы имеете в виду, но я подумал, что выложу это на всякий случай, если мне чего-то не хватает. Это похоже на антипаттерн.

3. Реальный вопрос: кто вызывает событие и почему? Может быть, вам нужна тема. Может быть, вы этого не делаете. Но ответ заключается в использовании этого класса, а не в его реализации.

4. Извините, я не очень ясно выразился. Вся идея, ради которой я здесь снимал, заключается в том, чтобы иметь возможность произвольно запускать ее изнутри класса.

5. Итак, теперь реальный вопрос заключается в том, при каких условиях вы хотите произвольно вызывать onNext: При каком-то событии, через некоторое время при возникновении комбинации событий? Тема может быть тем, что вы хотите, но я в этом сильно сомневаюсь.

Ответ №1:

Если я правильно понимаю ваши требования, они:

  • Предоставить общедоступный IObservable<T>
  • Внутри класса, быть в состоянии вызвать его OnNext , OnError и OnCompleted

Это сводится к необходимости чего-то, что реализует IObserver<T> и IObservable<T> , но только IObservable<T> публично. ISubject<T> определяется как реализация этих двух интерфейсов, а простой Subject<T> — это самая простая его реализация.

Ваше текущее решение настолько простое и понятное, насколько это возможно, все остальное потребует самостоятельного изобретения Subject<T> .

Комментарии:

1. Спасибо. Это ответ, который у меня был; Я просто хотел убедиться, что я не был наивным, предполагая, что не было более элегантного механизма.