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