Реактивное расширение - вернуть то же самое наблюдаемое или создать новое? - PullRequest
3 голосов
/ 14 октября 2011

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

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

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

Ответы [ 2 ]

4 голосов
/ 14 октября 2011

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

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

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

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

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

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

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

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

0 голосов
/ 14 октября 2011

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

...