Реактивное расширение — возвращает то же наблюдаемое или создает новое?

#c# #wpf #mvvm #system.reactive

#c# #wpf #mvvm #system.reactive

Вопрос:

Я пытаюсь разработать абстракцию уровня обслуживания с помощью Rx. Я завершил все вызовы веб-сервисов, используя FromAsyncPattern . У меня будет несколько ViewModels подписок на эти наблюдаемые, у некоторых может быть несколько подписок.

  • Должен ли я создавать readonly IObservable<T> свойства в своем ServiceProxy классе (одноэлементном) и создавать один раз в конструкторе или я должен каждый раз создавать новые наблюдаемые в методах обслуживания и возвращать их?

  • Имеет ли это значение?

Ответ №1:

Имеет ли это значение?

В данном случае нет. В этом разница между холодным наблюдаемым объектом (например, тем, что возвращает Create) и горячим наблюдаемым объектом. FromAsyncPattern возвращает AsyncSubject , что означает, что он будет «воспроизводить» результат любым подписчикам (так что это холодно, но не совсем так, больше похоже на «холодно»).

С другой стороны, Create в конечном итоге приведет к повторному запуску кода для каждого подписчика (точно так же, как если бы у вас был запрос L2S, запуск Foreach для него вызвал бы другой вызов базы данных). Иногда это то, что вы хотите, иногда это не так.

Чтобы превратить холодную наблюдаемую в горячую наблюдаемую, добавьте это в конец:

 .Multicast(new Subject<TTheType>()).RefCount();
  

И если вы хотите взять горячую наблюдаемую (например, наблюдаемую.Запустите) и сделайте его холодным, используйте Defer:

 var coldObs = Observable.Defer(() => 
    Observable.Start(() => doSomethingAndReturnAValue()));
  

Это означает, что каждый раз, когда кто-то подписывается на coldObs, вызывается doSomethingAndReturnAValue.

Ответ №2:

Вы не можете создавать IObservalble<T> свойства для представления IObservable , созданного с помощью using FromAsyncPattern , поскольку этот метод возвращает функцию, которая при вызове с правильными значениями вернет a IObservable<T> (где T — возвращаемый тип исходного базового синхронного метода). Таким образом, ваш уровень абстракции Rx будет иметь методы, которые принимают фактические параметры как исходные методы уровня обслуживания, но вместо T возвратов IObservable<T> .

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

1. Я также использую наблюдаемое. Создайте, чтобы обернуть несколько вызовов службы обратного вызова, могут ли они быть выполнены как свойства. Я пытаюсь выяснить, есть ли какие-либо преимущества / недостатки в этих подходах к броску. Поскольку некоторые из них являются горячими наблюдаемыми, прослушивающими потоки. Не будет ли лучше, если я создам только один раз?