2010-05-20 14 views
23

Duplicar posibles:
Good example of Reactive Extensions Useejemplos del mundo real de Rx

He estado jugando con la extensión reactiva por un tiempo ahora, pero sobre todo LIMITADÓ/usuario componer eventos impulsados ​​dentro de una interfaz de WPF.

Es una forma nueva y poderosa de hacer una programación asincrónica, y tengo curiosidad sobre lo que otras personas están haciendo con ella, y dónde crees que podría mejorar la forma en que estamos haciendo las cosas actualmente ?

+0

Hace un tiempo vi esta publicación en el blog de Roger Alsing usando Rx para implementar un bus de mensajes que pensé que estaba bien: http: // rogeralsing.com/2010/01/23/rx-framework-building-a-message-bus/ – theburningmonk

+0

La API sigue fluctuando, por lo que no he tomado una dependencia de Rx en ninguno de mis códigos de producción; ni estoy al tanto de que alguien más lo haga. –

+0

De acuerdo, he tenido el mismo problema con Pex, cada nueva versión tenía tantos cambios y rompe mi código – theburningmonk

Respuesta

39

Utilizamos RX con gran éxito en dos proyectos (Silverlight UI) ya. Al principio, la intención era simplify the WCF access layer). Lo racional era que, en el peor de los casos, siempre podemos volver a las formas estándar (de devolución de llamada) de hacer las cosas sin afectar los niveles más altos de la IU.

Poco sabíamos que RX es como una droga adictiva: una vez que comienzas a usarla simplemente no hay vuelta. Al igual que un virus se extendió rápidamente de esta capa de comunicación de bajo nivel de todo el camino hasta componentes de interfaz:

  • empezamos con el azúcar sintáctica sencilla de hacer que acceden a servicios WCF simple.
  • partir de ahí fue un paso natural para extender RX a la mensajería asíncrona de servidor a cliente
  • después de usar RX fusionar estas dos maneras para que el cliente se comunique con el servidor en una sola para ViewModels son agnósticos acerca de cómo ellos reciben mensajes era una opción predeterminada.

Y entonces fue completa capitulación:

  • necesidad de manejar mensajes que llegan fuera de orden?
  • ¿necesita actualizar una celda en la cuadrícula cuando cambia el precio?
  • tienen un problema de rendimiento porque el cliente es bombardeado por mensajes del servidor?
  • tienen alguna lógica de CEP rudimental para manejar?

Bueno, adivina qué, no hay operador de RX para eso;) (y si no hay - Usted puede simplemente escribir uno)

La parte más difícil de todo era superar que "mi-cerebro- duele-tan-malo "sensación de que todos en nuestro equipo experimentaron al principio. El cerebro de un simple mortal condicionado por años de código de manejo-mi-evento-por-esta-devolución de llamada simplemente no está conectado de la misma forma en que RX ve el mundo. Como resultado, el código RX (especialmente una vez que se hace cada vez más denso mientras se manejan escenarios cada vez más complicados) para una mente no preparada parece un abracadabra completo que de manera divertida resulta en un conejo sacado de un sombrero aparentemente vacío. Desafortunadamente, la realidad es que no hay lugar para la magia en el código de ejecución de producción y, por lo tanto, todo el equipo debe estar a bordo, lo que significa que todos tendrán que pasar por este doloroso proceso de reconfigurar sus cerebros en lo que al principio parece una forma muy poco natural.

Diría que es un factor humano y no la API RX en sí misma el mayor obstáculo para la adopción efectiva de RX. ¡Pero vale la pena!

+2

+1 eso es exactamente lo que siento al respecto. Es un poco una curva de aprendizaje que una vez que lo tienes, es como una puerta abierta que termina en todas partes. Algo así como LINQ :) – Rangoric

+3

LOL prácticamente la misma experiencia aquí;) Lo único que debo agregar es que RX parece "abracadabra" solo para una persona nueva, para alguien que se ha ajustado al concepto es muy descriptivo. –

3

Samuel McAravey tiene un video on Channel9 que describe una aplicación SilverLight del mundo real que construyó utilizando RX. Él even made it available on CodePlex.

Además, aquí están algunos de los usos prácticos cuando se puede aplicar RX incluso si usted no tiene requisitos asíncronos:

  • Si desea permitir usuario desplazarse a través de una lista que muestra algunos detalles en el lado, consultar los detalles sincrónicamente puede dañar su rendimiento de desplazamiento. .Throttle() es tu amigo aquí.
  • Algunas veces debe realizar una búsqueda tan pronto como el usuario deje de escribir. Lo mismo, use .Throttle y usted está bien.
  • Use Routed Commmands in MVVM. Muy bueno para usar en elementos de la lista, simplemente especifique CommandParameter = "{Binding}" y puede verlos en el nivel de contenedor .
+0

Enchufe auto desvergonzado: este es un ejemplo rápido de ejecutar una función cuando el usuario deja de escribir: http://bryanmitchellanderson.com/2010/08/rx-running-a-function-when-the-user-stops-typing/ –

+0

@Bryan Anderson: No hay nada descarado en un autoenchufe. Bueno, al menos Paul Betts definitivamente no lo cree así :-) –

+0

@Fyodor Soikin: Es cierto, pero la biblioteca de @Paul Betts realmente patea algunos aspectos importantes cuando se trata de usar Rx en una aplicación de Silverlight o WPF. casi tan desvergonzado. –

11

He escrito una biblioteca más completa para la integración de WPF/Silverlight y Rx, la documentación es (EDIT: Ya no pésimo!) En este momento, pero usted puede comprobar hacia fuera en:

http://www.reactiveui.net

+0

puede que desee actualizar el enlace. –

3

Estamos utilizando con éxito Rx al cargar datos desde el backend en una aplicación de Silverlight. Recientemente migramos de un servicio SOAP a generación XML simple en el servidor y Rx llegó justo a tiempo para que pudiéramos usarlo en lugar de WebClient o WebRequest (de hecho, ahora incluimos WebClient en Observable, pero probablemente cambiemos a WebRequest).

Tuvimos un error hace un par de días; nos dimos cuenta de que las URL de solicitud eran tan largas que se truncaron. Afortunadamente podemos dividir la solicitud en múltiples y concatenar las respuestas, pero resolver eso usando solo WebClient hubiera significado crear una cola y una máquina de estado para manejar las solicitudes en secuencia ... En cambio, usando Rx podríamos simplemente dividir la solicitud en grupos , haz lo que hicimos antes, ¡pero en una llamada a SelectMany y terminamos! Rx al rescate!

2

Probablemente mi solución favorita en este momento para Rx es usarlo como un agregador de eventos. Echar un vistazo aquí:

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

que esta adaptado a Silverlight y funciona como un encanto. Lo que es increíblemente poderoso es la capacidad de filtrar eventos. Por ejemplo, un evento es simplemente escribir "cadena" porque no hay otra información. En lugar de crear una clase fuertemente tipada para cada evento simple, creé una clase que expone las constantes (por lo que no hay cadenas mágicas), por ejemplo, BEGIN_BUSY (cuando se llama a un servicio web), END_BUSY (cuando está hecho), etc.

Para suscribirse, puede literalmente hacer:

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

¡Me encanta!

Cuestiones relacionadas