#.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. Спасибо. Это ответ, который у меня был; Я просто хотел убедиться, что я не был наивным, предполагая, что не было более элегантного механизма.