Pregunta

Los nuevos marcos IObservable/IObserver en la biblioteca System.Reactive que vienen en .NET 4.0 son muy interesantes (consulte este y este enlace).

Puede que sea demasiado pronto para especular, pero ¿habrá también (a falta de un término mejor) un marco similar a IQueryable creado para estas nuevas interfaces?

Un caso de uso particular sería ayudar en el preprocesamiento de eventos en el origen, en lugar de en la cadena de recepción de llamadas.Por ejemplo, si tiene una interfaz de evento muy "conversadora", utilice el Subscribe().Where(...) recibirá todos los eventos a través de la canalización y el cliente realiza el filtrado.

Lo que me pregunto es si habrá algo parecido a IQueryableObservable, mediante el cual estos métodos LINQ se "compilarán" en algunos métodos "inteligentes". Subscribe implementación en una fuente.Puedo imaginar ciertas arquitecturas de servidores de red que podrían usar dicho marco.¿O qué tal un complemento para SQL Server (o cualquier RDBMS) que permitiría que el código .NET reciba nuevas notificaciones de datos (activadores en el código) y necesitaría que esas notificaciones se filtren en el lado del servidor?

¿Fue útil?

Solución

Bueno, lo tienes en la última versión de Rx, en forma de una interfaz llamada IQ observable (pronunciado como IQueryableObservable).Estén atentos al vídeo del Canal 9 sobre el tema, que se publicará a principios de la próxima semana.

Para situar un poco esta característica, uno debe darse cuenta de que conceptualmente hay tres ejes ortogonales en el rompecabezas Rx/Ix:

  • Qué el modelo de datos al que se dirige.Aquí encontramos modelos basados ​​en pull versus modelos basados ​​en push.Su relación se basa en dualidad.Existen transformaciones entre esos mundos (p. ej.A Enumerable).
  • Dónde ejecuta operaciones que impulsan sus consultas (sensu lato).Ciertos operadores necesitan concurrencia.Aquí es donde Planificación y entra la interfaz IScheduler.Los operadores existen para saltar entre dominios de concurrencia (p. ej.Observar activado).
  • Cómo es necesario ejecutar una expresión de consulta.Ya sea palabra por palabra (IL) o traducible (árboles de expresión).Su relación se basa en homoiconicidad.Existen conversiones entre ambas representaciones (p. ej.Como consultable).

Todo lo que permite la interfaz IQbservable (que es dual entre IQueryable y la representación del árbol de expresión de una consulta IObservable) es el último punto.A veces la gente confunde el acto de traducción de consultas (el "cómo" ejecutar) con aspectos remotos (el "dónde" ejecutar).Mientras que normalmente lo haces traducir consultas en algún idioma de destino (como WQL, PowerShell, DSQL para servicios de notificación en la nube, etc.) y remoto Si los integramos en algún sistema objetivo, ambas preocupaciones pueden desacoplarse.Por ejemplo, podría utilizar la representación del árbol de expresión para hacer local optimización de consultas.

Con respecto a posibles problemas de seguridad, esto no es diferente de las capacidades de IQueryable.Por lo general, solo se eliminará el lenguaje de expresión y no los operadores "verdaderamente secundarios" (lo que sea que eso signifique para lenguajes distintos de los funcionales fundamentalistas).En particular, las operaciones Suscribir y Ejecutar permanecen locales y lo sacan de la mónada consultable (por lo tanto, activan la traducción, tal como lo hace GetEnumerator en el mundo de IQueryable).Cómo controlarías el acto de suscribirte es algo que dejaré a la imaginación del lector.

Empieza a jugar con el últimos bits hoy y cuéntanos lo que piensas.Estén atentos también al próximo vídeo de Channel 9 sobre esta nueva característica, que incluye una discusión sobre parte de su filosofía de diseño.

Otros consejos

Si bien esto parece una posibilidad interesante, tendría varias reservas sobre su implementación.

1) Así como no se pueden serializar expresiones lambda no triviales utilizadas por IQueryable, serializarlas para Rx sería igualmente difícil.Es probable que desee poder serializar lambdas de declaración y de varias líneas como parte de este marco.Para hacer eso, probablemente necesitarás implementar algo como los otros proyectos favoritos de Erik Meijer: Dryad y Volta.

2) Incluso si pudiera serializar estas expresiones lambda, me preocuparía la posibilidad de ejecutar código arbitrario en el servidor enviado desde el cliente.Esto fácilmente podría plantear un problema de seguridad mucho mayor que los scripts entre sitios.Dudo que el beneficio potencial de permitir que el cliente envíe expresiones al servidor para su ejecución supere las implicaciones de vulnerabilidad de seguridad.

8 (ahora 10) años en el futuro: Qactive (ex Rxx), un Rx.Net queryable basado proveedor de servidor TCP reactiva Es la respuesta a la "cuestión de que se trate"

Servidor

Observable
    .Interval(TimeSpan.FromSeconds(1))
    .ServeQbservableTcp(new IPEndPoint(IPAddress.Loopback, 3205));

Cliente

var datasourceAddress = new IPEndPoint(IPAddress.Loopback, 3205);
var datasource = new TcpQbservableClient<long>(datasourceAddress);

(
     from value in datasource.Query()
     //The code below is actually executed on the server
     where value <= 5 || value >= 8
     select value
)
.Subscribe(Console.WriteLine);

Cómo la mente de soplado de esto es que los clientes pueden decir qué y con qué frecuencia desea que los datos que reciben y el servidor todavía pueden limitar y controlar cuándo, con qué frecuencia y la cantidad de datos que devuelve.

Para obtener más información acerca de la https://github.com/RxDave/Qactive

Otra blog.sample

https://sachabarbs.wordpress.com/ 2016/12 / 23 / rx-sobre-el-alambre /

Uno de los problemas me gustaría ver resuelto con el Marco reactiva, si es posible, está permitiendo la emisión y Suscripción de cambiar las notificaciones de datos en caché de los servicios web y otros servicios de extracción solamente.

Al parecer, sobre la base de un nuevo Channel9 entrevista , que habrá apoyo LINQ para IObserver / IObservable en el BCL de .NET 4.

Sin embargo, será esencialmente consultas estilo LINQ a objetos, por lo que en esta etapa, no se ve como un 'inteligente suscribir' como usted dice. Eso es por lo que las implementaciones básicas van en .NET 4. (de mi comprensión de la entrevista anterior)

Una vez dicho esto , el marco reactivo (Rx) puede tener implementaciones más detalladas de IObserver / IObservable, o puede ser capaz de escribir su propia muerte en Expression<Func...> para los parametros Subscribe y luego utilizando la Árbol de expresión de la Func de suscripción en una forma más inteligente que se adapte al canal de eventos se está suscribiendo a.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top