Utilisation de fournisseurs observables
En implémentant l’interface IQbservable et en utilisant les méthodes d’extension de fabrique fournies par le type Qbservable , vous pouvez écrire un fournisseur LINQ personnalisé pour interroger n’importe quel type de données externes, afin que ces données soient traitées comme des séquences auxquelles vous pouvez vous abonner. Par exemple, l’exemple LINQ to WQL dans le Centre de développement MSDN rx montre comment créer un fournisseur simple pour interroger des événements WMI à l’aide de WQL. Vous pouvez utiliser les opérateurs LINQ d’usine fournis par le type Qbservable pour extraire une séquence d’événements WMI et les interroger, les filtrer et les composer. L’abonnement à cette séquence déclenche la traduction de l’expression de requête LINQ dans le langage cible, dans ce cas WQL.
Utilisation de l’interface IQbservable pour interroger des données externes
Lorsque nous mention que nous voulons interroger des données, nous sommes d’abord préoccupés par ce que nous voulons interroger. Il peut s’agir d’une collection IEnumerable basée sur extraction ou d’une séquence observable asynchrone basée sur push. Nous voulons également savoir où (dans quel contexte) nous voulons exécuter la requête. Pour les séquences observables , cela est géré par l’interface IScheduler et ses différents types d’implémentation scheduler. Enfin, nous voulons savoir comment nous effectuons la requête. Nous pouvons représenter une requête (expression lambda) en verbatim (compilée dans du code de langage intermédiaire .NET), dans laquelle chaque opérateur de la requête sera évalué de manière linéaire. C’est le cas pour les méthodes d’opérateur de fabrique du type Observable . Vous pouvez également représenter votre requête à l’aide d’arborescences d’expressions, qui peuvent être parcourues pour obtenir l’algorithme représenté (par exemple, prédire si un élément est supérieur à une valeur, etc.), puis traduire l’algorithme en un code spécifique au domaine, comme une instruction de requête T-SQL pour interroger une base de données SQL, des requêtes HTTP spécifiques pour un URI de service Web particulier, Commandes PowerShell, DSQL pour les services de notification cloud, etc. C’est le cas pour les méthodes d’opérateur de fabrique du type Qbservable . Le code spécifique au domaine traduit peut être exécuté dans un système cible distant, ou vous pouvez utiliser la représentation d’arborescence d’expressions pour effectuer l’optimisation des requêtes locales.
Tout comme IObservable/IObserver est un double d’IEnumerable/IEnumerator, IQbservable est le double d’IQueryable et fournit une représentation d’arborescence d’expressions d’une requête IObservable. Vous pouvez changer entre les types IQbservable et IObservable à l’aide des méthodes AsQbservable et AsObservable. L’appel d’AsQbservable produit une arborescence d’expressions composée d’un nœud unique qui appelle le instance IObservable d’origine. Cette relation est importante pour comprendre pourquoi une requête IQbservable complète doit être définie à partir d’une séquence IQbservable et ne peut pas être obtenue simplement en appelant AsQbservable sur une requête IQbservable existante. Dans l’exemple suivant, l’appel à AsQbservable génère une arborescence de requêtes complète uniquement lorsque vous générez la requête en appliquant IQbservable AsQbservable à la source de données.
var source = Observable.Interval(TimeSpan.FromSeconds(1));
var q = source.AsQbservable();
Console.WriteLine(q.ToString());
var sub = q.Subscribe(Console.WriteLine);
Console.ReadKey();
L’interface IQbservable est destinée à l’implémentation par les fournisseurs de requêtes. Il est uniquement censé être implémenté par les fournisseurs qui implémentent également IQbservable<T>. Si le fournisseur n’implémente pas également IQbservable<T>, les opérateurs de requête standard ne peuvent pas être utilisés sur la source de données du fournisseur. L’interface IQbservable hérite de l’interface IObservable de sorte que si elle représente une requête, les résultats de cette requête peuvent être abonnés. L’abonnement et la publication entraînent l’exécution de l’arborescence d’expressions associée à un objet Qbservable . La définition de « exécution d’une arborescence d’expressions » est spécifique à un fournisseur de requête. Par exemple, cela peut impliquer la traduction de l’arborescence d’expressions en un langage de requête approprié pour la source de données sous-jacente. La propriété Expression encapsule l’arborescence des expressions associée au instance IQbservable, tandis que le fournisseur encapsule le fournisseur de requêtes associé à la source de données.
L’ensemble de méthodes déclarées dans la classe Qbservable fournit une implémentation des opérateurs de requête standard pour interroger les sources de données qui implémentent IQbservable. Les opérateurs de requête standard sont des méthodes à usage général qui suivent le modèle LINQ et vous permettent d’exprimer des opérations de traversée, de filtre et de projection sur des données dans n’importe quel . Langage de programmation basé sur NET. La majorité des méthodes de cette classe sont définies en tant que méthodes d’extension qui étendent le type IQbservable . Cela signifie qu’ils peuvent être appelés comme une méthode instance sur n’importe quel objet qui implémente IQbservable. Ces méthodes qui étendent IQbservable n’effectuent aucune requête directement. Au lieu de cela, leur fonctionnalité consiste à générer un objet Expression, qui est une arborescence d’expressions qui représente la requête cumulative. Les méthodes passent ensuite la nouvelle arborescence d’expressions à la méthode CreateQuery. L’exécution réelle de la requête sur les données cibles est effectuée par une classe qui implémente IQbservable.