Question

La nouvelle IObservable/IObserver cadres dans le Système.Réactif de la bibliothèque de venir dans .NET 4.0 sont très intéressantes (voir cette et cette lien).

C'est peut-être trop tôt pour spéculer, mais sera-t-il aussi être (par manque d'un meilleur terme) IQueryable-comme le cadre intégré pour ces nouvelles interfaces ainsi?

Un cas d'utilisation particulier serait d'aider à pré-traitement des événements à la source, plutôt que dans la chaîne de réception d'appels.Par exemple, si vous avez un très "bavard" événement de l'interface, à l'aide de la Subscribe().Where(...) recevez tous les événements à travers le pipeline et le client ne le filtrage.

Ce que je me demande c'est si il y aura quelque chose de semblable à IQueryableObservable, en vertu de laquelle ces méthodes LINQ sera "compilé" dans certains "intelligents" les Subscribe mise en œuvre d'une source.Je peux imaginer certaines réseau architectures de serveur qui pourrait utiliser un tel cadre.Ou que diriez-vous un add-on pour SQL Server (ou les SGBDR d'ailleurs) que ne le permettent .NET code pour recevoir les nouvelles données des notifications (des déclencheurs dans le code) et aurait besoin de ces notifications filtrés côté serveur.

Était-ce utile?

La solution

Eh bien, vous avez obtenu dans la dernière version de Rx, sous la forme d'une interface appelée IQbservable (prononcé comme IQueryableObservable). Restez à l'écoute pour un canal 9 vidéo sur le sujet, à venir la semaine prochaine.

Pour situer cette fonction un peu, il faut savoir il y a conceptuellement trois axes orthogonaux au casse-tête Rx / Ix:

  • Que le modèle de données est que vous ciblez. Ici, nous trouvons de type pull par rapport à des modèles par poussage. Leur relation est basée sur la dualité . Les transformations existent entre ces mondes (par exemple ToEnumerable).
  • vous exécutez des opérations qui conduisent vos requêtes (lato sensu). Certains opérateurs ont besoin concurrency. C'est là planification et l'interface IScheduler entrent en jeu. Les opérateurs existent pour sauter entre les domaines (par exemple ObserveOn accès concurrentiel).
  • Comment une expression de requête doit exécuter. Soit textuellement (IL) ou translatables (arbres d'expression). Leur relation est basée sur homoiconicité . Les conversions existent entre les deux représentations (par exemple AsQueryable).

Tout l'interface IQbservable (qui est le double de IQueryable et la représentation arborescente d'expression d'une requête IObservable) permet est le dernier point. Parfois, les gens confondent l'acte de traduction de requête (le « comment » pour exécuter) des aspects Remoting (le « où » à courir). Bien que généralement vous faites traduire requêtes dans une langue cible (tels que WQL, PowerShell, DSQLs pour les services de notification des nuages, etc.) et à distance les dans un système cible, les deux préoccupations peut être découplé. Par exemple, vous pouvez utiliser la représentation de l'arbre d'expression pour faire locale l'optimisation des requêtes.

En ce qui concerne les problèmes de sécurité possibles, cela ne diffère pas des capacités IQueryable. Généralement, on ne fera que la langue à distance d'expression et non des opérateurs « vraiment côté EFFECTUER » (quoi que cela signifie pour les langues autres que fonctionnels fondamentalistes). En particulier, les opérations Run Abonnez-vous et rester local et vous ôtes du interrogeable monade (déclenchement donc la traduction, comme GetEnumerator fait dans le monde de IQueryable). Comment vous auriez à distance l'acte de abonnée est quelque chose que je vais laisser à l'imagination du lecteur.

Commencez à jouer avec le derniers morceaux aujourd'hui et laissez-nous savoir ce que vous pensez. Aussi restez à l'écoute pour la prochaine Channel 9 vidéo sur cette nouvelle fonctionnalité, y compris une discussion sur une partie de sa philosophie de conception.

Autres conseils

Bien que cela sonne comme une possibilité intéressante, j'aurais plusieurs réserves quant à la mise en œuvre de cette.

1) tout comme vous ne pouvez pas sérialiser non-trivial lambda expressions utilisées par IQueryable, la sérialisation de ces de Rx serait même difficile.Vous voudrez probablement être en mesure de sérialiser multi-ligne et de la déclaration des lambdas dans le cadre de ce cadre.Pour ce faire, vous auriez probablement besoin de mettre en place quelque chose comme Erik Meijer autres projets animal - Dryade et de la Volta.

2) Même si vous pourriez sérialiser ces expressions lambda, je serais préoccupé par la possibilité d'exécuter du code arbitraire sur le serveur envoyée par le client.Cela pourrait facilement poser un problème de sécurité beaucoup plus grande que le cross-site scripting.Je doute que le potentiel avantage de permettre au client d'envoyer des expressions pour le serveur pour exécuter l'emporte sur la vulnérabilité de la sécurité implications.

8 (maintenant 10) ans dans l'avenir: je suis tombé sur Qactive (ancien Rxx), un Rx.Net basé queryable fournisseur de serveur TCP réactif Il est la réponse à la « question en question »

Serveur

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

Chose hallucinante à ce sujet est que les clients peuvent dire quoi et à quelle fréquence ils veulent les données qu'ils reçoivent et le serveur peuvent encore limiter et contrôle, à quelle fréquence et la quantité de données qu'il retourne.

Pour plus d'informations sur cette https://github.com/RxDave/Qactive

Une autre blog.sample

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

Un problème que j'aimerais voir résolu avec le Cadre réactive, si elle est possible, permet à l'émission et ouscription modifier les notifications pour les données mises en cache des services Web et d'autres services de traction uniquement.

Il semble, sur la base d'une nouvelle Channel9 entretien , qu'il y aura un soutien LINQ pour IObserver / IObservable dans la BCL de 4 .NET.

Cependant, il sera essentiellement requêtes de style LINQ-à-objets, donc à ce stade, il ne ressemble pas à un « subscribe intelligent » comme vous le dites. C'est aussi loin que les implémentations de base vont dans .NET 4. (De ma compréhension de l'interview ci-dessus)

Cela dit , le cadre réactif (Rx) peuvent avoir des implémentations plus détaillées de IObserver / IObservable, ou vous pouvez être en mesure d'écrire votre propre passage dans Expression<Func...> pour les paramaters de Subscribe puis en utilisant la Arbre d'expression de la Func de souscrire de façon plus intelligente qui convient le canal d'événements que vous êtes abonné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top