RIA Services, соответствующие ответу на запрос - PullRequest
1 голос
/ 28 сентября 2010

Мне было интересно, может ли кто-нибудь дать совет по следующей проблеме. В настоящее время мы разрабатываем приложение Silverlight 4 на основе RIA .NET Services. Один из экранов в приложении позволяет пользователям вводить строку поиска, и после 2 секунд бездействия запрос отправляется в нашу службу домена. Это все прекрасно справляется с Rx.

Теперь в настоящее время возможно выполнить второй поиск до того, как оригинал вернется. Также возможно, что второй запрос может вернуться раньше, чем первый.

На самом деле я просто пытаюсь выяснить, какие шаблоны и подходы люди используют для управления правильным ответом на правильный запрос.

Используете ли вы какой-либо идентификатор операции в ваших запросах? Вы создаете новые экземпляры своих доменных служб для каждого запроса? Можно ли привязать завершенное событие запроса к наблюдаемому Rx-контролю события textchange?

Любое управление будет действительно полезным,

Dave

Ответы [ 4 ]

2 голосов
/ 24 ноября 2010

Вам будет легко решить эту проблему.

Если я предполагаю, что у вас есть наблюдаемая строка, которая инициирует поиск, и что у вас есть доменная служба, которая возвращает объект Result при получении строки, то вам нужен такой код:

IObservable<string> searchText
    = ...;

Func<string, IObservable<Result>> searchRequest
    = Observable.FromAsyncPattern<string, Result>(
        search.BeginInvoke,
        search.EndInvoke);

IObservable<Result> results
    = (from st in searchText
       select searchRequest(st))
      .Switch();

Магия заключается в методе расширения Switch, который «переключается» на последнюю наблюдаемую информацию, возвращаемую из IObservable<IObservable<Result>> - да, это вложенная наблюдаемая.

Когда приходит новый searchText, запрос возвращает новый IObservable<Result>, созданный из входящего поискового текста. Switch затем переключает наблюдаемую results на использование этой последней наблюдаемой и просто игнорирует все ранее созданные наблюдаемые.

Таким образом, в результате наблюдаются только последние результаты поиска, а все предыдущие результаты игнорируются.

Надеюсь, это имеет смысл. : -)

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

Эрик Мейер говорит об этом здесь (примерно через 30 минут): http://channel9.msdn.com/Events/MIX/MIX10/FTL01 Он объясняет оператор Switch примерно через 36 минут.

0 голосов
/ 07 марта 2012

Выезд rxx http://rxx.codeplex.com/

В нем есть масса дополнительных вещей, которые помогут, особенно в вашем случае, я думаю, что Динамические объекты и наблюдаемые объекты могут быть чем-то, что сделает вашу жизнь проще.

0 голосов
/ 21 октября 2010

Самый простой способ IMO - иметь тему для запросов, которые вы уведомляете до отправки любого запроса в WCF. Тогда вместо подписки на наблюдаемые, созданные из завершенного события подпишитесь на CompletedEventObservable.TakeUntil(RequestsSubject). Таким образом, вы никогда не будете уведомлены с ответом на предыдущий запрос.

...