2010-05-20 4 views
23

Можно создать дубликат:
Good example of Reactive Extensions Useпримеры реального мира Rx

Я играл вокруг с Reactive Extension на некоторое время теперь, но в основном ограничивается обработка/сочинял пользователя управляемых событий в интерфейсе WPF.

Это такой мощный, новый способ делать асинхронное программирование, и мне любопытно, что с ним делают другие люди, и как вы думаете, что это может улучшить то, как мы сейчас делаем? ?

+0

Я видел это сообщение в блоге Роджера Альсинга еще раз, используя Rx для реализации шины сообщений, которая, как я думал, была опрятной: http: // rogeralsing.com/2010/01/23/rx-framework-building-a-message-bus/ – theburningmonk

+0

API постоянно колеблется, поэтому я не принял зависимость Rx от любого из моего производственного кода; и я не знаю, кто еще это делает. –

+0

Согласны, имели ту же проблему с Pex, каждая новая версия имела так много изменений, и она прерывает мой код. – theburningmonk

ответ

39

Мы использовали RX с большим успехом на двух проектах (Silverlight UI) уже. В начале было simplify the WCF access layer). Рациональным было то, что в худшем случае мы всегда можем вернуться к стандартным (обратным) способам делать вещи, не затрагивая более высокие уровни пользовательского интерфейса.

Мы мало знали, что RX похож на привыкание к наркотикам - как только вы начнете использовать его, просто нет возврата. Как и вирус, он быстро распространился с этого уровня связи на нижнем уровне вплоть до компонентов пользовательского интерфейса:

  • мы начали с простого синтаксического сахара, чтобы упростить доступ к услугам WCF.
  • оттуда это был естественный шаг для расширения RX на сервер-клиент асинхронной передачи сообщений
  • после этого использовать RX, чтобы объединить оба этих способов для клиента общаться с сервером в один так ViewModels являются агностиками о том, как они получают сообщения по умолчанию.

И тогда это была полная капитуляция:

  • нужно обрабатывать сообщения, приходящие из строя?
  • необходимо, чтобы вспышка ячейки на сетке при изменении цены?
  • имеют проблему с производительностью, поскольку клиент подвергается бомбардировке сообщениями с сервера?
  • есть рудиментарная логика CEP?

Ну, угадайте, что есть оператор RX для этого;) (и если есть нет - вы можете легко просто написать один)

Самая трудная часть всего этого было преодолеть, что «моя-brain- болит-так плохо ", чувствуя, что все в нашей команде испытали вначале. Мозг простого смертного, обусловленного многолетним кодированием handle-my-event-by-this-callback, просто не связан с тем, как RX видит мир. В результате RX-код (особенно когда он постепенно становится все более плотным при обработке более сложных сценариев) для неподготовленного ума выглядит как полная абракадабра, которая забавно приводит к тому, что кролик вытащил из кажущейся пустой шляпы. К сожалению, реальность заключается в том, что в производстве нет места для магии в производственном коде, и поэтому вся команда должна быть на борту, а это означает, что всем придется пройти через этот болезненный процесс переделания их мозгов в то, что кажется сначала очень неестественным способом.

Я бы сказал, что это человеческий фактор, а не сам API RX, который является самым большим препятствием для эффективного внедрения RX. Но мальчик стоит того!

+2

+1 Это точно, как я к этому отношусь. Это немного кривая обучения, что, как только вы ее получите, это похоже на открытую дверь, и она заканчивается повсюду. Kinda like LINQ :) – Rangoric

+3

LOL почти такой же опыт здесь;) Единственное, что я должен добавить, это то, что RX выглядит «абракадабра» только для нового человека, для кого-то, кто приспособился к понятию, он очень описательный. –

3

Samuel McAravey имеет video on Channel9, описывающий приложение SilverLight реального мира, которое он построил с использованием RX. Он even made it available on CodePlex.

Кроме того, здесь несколько практических применений, когда вы можете применить RX, даже если у вас нет асинхронных требований:

  • Если вы хотите, чтобы позволить пользователю прокручивать список отображаются некоторые детали на стороне, запрос для деталей синхронно может повредить вашу производительность прокрутки. .Throttle() - ваш друг здесь.
  • Иногда вам нужно выполнить поиск, как только пользователь перестанет печатать. То же самое, используйте .Throttle, и вы в порядке.
  • Использование Routed Commmands in MVVM. Очень удобно использовать элементы списка, просто укажите CommandParameter = "{Binding}", и вы можете поймать их на уровне контейнера.
+0

Бесшумный самостоятельный штекер - вот краткий пример запуска функции, когда пользователь перестает печатать на машинке: http://bryanmitchellanderson.com/2010/08/rx-running-a-function-when-the-user-stops-typing/ –

+0

@Bryan Anderson: Нет ничего бессовестного в подключении. Ну, по крайней мере, Пол Беттс здесь определенно не думает так :-) –

+0

@Fyodor Soikin: Правда, но библиотека @Paul Betts действительно наносит удар по основному прикладу, когда дело доходит до использования Rx в приложении Silverlight или WPF, так что isn ' почти бесстыдно. –

11

Я написал более полную библиотеку для интеграции WPF/Silverlight и Rx, документация (EDIT: Нет больше паршивый!) Прямо сейчас, но вы можете проверить его на:

http://www.reactiveui.net

+0

, возможно, захочет обновить ссылку. –

3

Мы успешно используем Rx при загрузке данных из бэкэнд в приложении Silverlight. Недавно мы перенесли из SOAP-сервиса простое генерирование XML на сервере, и Rx пришел как раз вовремя, чтобы мы могли использовать его вместо WebClient или WebRequest (фактически мы теперь переносим WebClient в Observable, но, вероятно, перейдем к WebRequest).

У нас была ошибка пару дней назад; мы поняли, что URL-адреса запросов были настолько длинными, что они были усечены. К счастью, мы можем разделить запрос на несколько и объединить ответы, но решить, что использование только WebClient означало бы создание очереди и конечного автомата для обработки запросов последовательно ... Вместо этого, используя Rx, мы могли бы просто разделить запрос в группах , делайте то, что мы делали раньше, но в призыве SelectMany, и мы закончили! Rx на помощь!

2

Возможно, моим любимым решением для Rx является его использование в качестве агрегатора событий. Посмотрите здесь:

http://jfromaniello.blogspot.com/2010/04/event-aggregator-with-reactive.html

Я приспособил это Silverlight и он работает как шарм. Что удивительно мощно, так это способность фильтровать события. Для примера одно событие просто набирает «строка», потому что другой информации нет. Вместо создания строго типизированного класса для каждого простого события я создал класс, который предоставляет константы (поэтому нет магических строк), например BEGIN_BUSY (при вызове веб-службы), END_BUSY (когда это делается), и т.д.

Для подписки вы можете буквально сделать:

(from e in EventAggregator.Subscribe<string>() where e.Equals(BEGIN_BUSY) select true).Subscribe(evt=> { // Listening only to the BEGIN_BUSY event }); 

Обожаю!

Смежные вопросы