Domanda

I nuovi framework IObservable/IObserver nella libreria System.Reactive in arrivo in .NET 4.0 sono molto interessanti (vedi Questo E Questo collegamento).

Potrebbe essere troppo presto per fare speculazioni, ma ci sarà anche un framework (in mancanza di un termine migliore) simile a IQueryable creato anche per queste nuove interfacce?

Un caso d'uso particolare potrebbe essere quello di assistere nella pre-elaborazione degli eventi alla fonte, piuttosto che nella catena delle chiamate riceventi.Ad esempio, se hai un'interfaccia di eventi molto "loquace", utilizzando il file Subscribe().Where(...) riceverà tutti gli eventi attraverso la pipeline e il client eseguirà il filtraggio.

Quello che mi chiedo è se ci sarà qualcosa di simile a IQueryableObservable, per cui questi metodi LINQ verranno "compilati" in alcuni metodi "intelligenti" Subscribe implementazione in una fonte.Posso immaginare alcune architetture di server di rete che potrebbero utilizzare un simile framework.Oppure che ne dici di un componente aggiuntivo per SQL Server (o qualsiasi RDBMS) che consenta al codice .NET di ricevere nuove notifiche di dati (trigger nel codice) e necessiterebbe di tali notifiche filtrate sul lato server.

È stato utile?

Soluzione

Bene, avete capito bene nella versione più recente di Rx, sotto forma di un'interfaccia denominata IQbservable (pronunciato come IQueryableObservable). Restate sintonizzati per un video Channel 9 in materia, fino a venire all'inizio della prossima settimana.

Per inquadrare questa caratteristica un po ', si dovrebbe rendersi conto ci sono concettualmente tre assi ortogonali al puzzle Rx / Ix:

  • Cosa il modello di dati viene target. Qui troviamo pull-base rispetto ai modelli push-based. Il loro rapporto si basa su dualità . Trasformazioni esistono tra questi mondi (ad esempio ToEnumerable).
  • Dove si eseguono operazioni che guidano le vostre domande (sensu lato). Alcuni operatori hanno bisogno di concorrenza. Questo è dove di pianificazione e l'interfaccia sono disponibili in IScheduler. Gli operatori esistono per hop tra i domini di concorrenza (ad esempio ObserveOn).
  • Come un'espressione di query deve eseguire. Sia letteralmente (IL) o traducibili (alberi di espressione). Il loro rapporto si basa su homoiconicity . Conversioni esistono tra entrambe le rappresentazioni (ad esempio AsQueryable).

Tutto l'interfaccia IQbservable (che è il doppio di IQueryable e la rappresentazione albero espressione di una query IObservable) consente è l'ultimo punto. A volte le persone confondono l'atto di traduzione query (il "come" per l'esecuzione) con aspetti remoti (il "dove" per l'esecuzione). Mentre di solito si fa translate query in qualche lingua di destinazione (come WQL, PowerShell, DSQLs per i servizi di notifica di cloud, etc.) e remoto di loro in qualche sistema di destinazione, sia le preoccupazioni può essere disaccoppiato. Ad esempio, è possibile utilizzare la rappresentazione ad albero dell'espressione di fare locale ottimizzazione delle query.

Per quanto riguarda i possibili problemi di sicurezza, questo non è diverso dalle funzionalità IQueryable. In genere lo farà solo a distanza il linguaggio delle espressioni e non qualsiasi "veramente laterale effettuando" operatori (qualunque cosa significhi per lingue diverse da quelle funzionali fondamentaliste). In particolare, l'Iscriviti e operazioni Run soggiorno locale e si prende fuori della monade queryable (quindi innescare traduzione, proprio come GetEnumerator fa nel mondo della IQueryable). Come si sarebbe a distanza l'atto di sottoscrizione è una cosa che lascio alla fantasia del lettore.

Inizia a giocare con la ultimi bit oggi e fateci sapere cosa ne pensate. Anche rimanete sintonizzati per la prossima Canale 9 video su questa nuova funzionalità, tra cui una discussione di alcuni della sua filosofia di design.

Altri suggerimenti

Anche se sembra una possibilità interessante, avrei molte riserve sull’implementazione di questa possibilità.

1) Proprio come non è possibile serializzare espressioni lambda non banali utilizzate da IQueryable, serializzarle per Rx sarebbe altrettanto difficile.Probabilmente vorrai essere in grado di serializzare lambda multilinea e di istruzioni come parte di questo framework.Per fare ciò, probabilmente dovresti implementare qualcosa come gli altri progetti preferiti di Erik Meijer: Driade e Volta.

2) Anche se potessi serializzare queste espressioni lambda, sarei preoccupato per la possibilità di eseguire codice arbitrario sul server inviato dal client.Ciò potrebbe facilmente rappresentare un problema di sicurezza molto maggiore dello scripting cross-site.Dubito che il potenziale vantaggio di consentire al client di inviare espressioni al server per l'esecuzione superi le implicazioni sulla vulnerabilità della sicurezza.

8 (ora 10) anni nel futuro: QActive (ex Rxx), una Rx.Net queryable basato fornitore di server TCP reattiva E 'la risposta alla "domanda in questione"

Server

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

Client

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);

cosa consigliarvi mente che soffia di questo è che i clienti possono dire che cosa e con quale frequenza si desidera che i dati che ricevono e il server possono ancora limitare e controllo quando, con quale frequenza e la quantità di dati restituisce.

Per ulteriori informazioni su questo https://github.com/RxDave/Qactive

Un altro blog.sample

https://sachabarbs.wordpress.com/ 2016/12 / 23 / rx-over-the-wire /

Un problema che mi piacerebbe vedere risolto con il quadro reattiva, se è possibile, sta consentendo l'emissione e abbonamento per modificare le notifiche per i dati memorizzati nella cache da servizi Web e altri servizi di pull-only.

Sembra, in base a una nuova Channel9 intervista , che non ci sarà il supporto per LINQ IObserver / IObservable nel BCL di .NET 4.

Tuttavia sarà essenzialmente query stile LINQ to Objects, quindi, in questa fase, non sembra come un 'intelligente subscribe' come dici tu. Questo è quanto le implementazioni di base vanno in .NET 4. (Dalla mia comprensione da quanto sopra intervista)

Detto questo , il quadro reattiva (Rx) possono avere implementazioni più dettagliate su IObserver / IObservable, o si può essere in grado di scrivere il proprio passaggio in Expression<Func...> per le paramaters Subscribe e quindi utilizzando il espressione Albero della Func di sottoscrivere in modo più intelligente che si adatta il canale dell'evento che si sta sottoscrivendo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top