Partilhar via


Usando provedores observáveis

Implementando a interface IQbservable e usando os métodos de extensão de fábrica fornecidos pelo tipo Qbservable , você pode escrever um provedor LINQ personalizado para consultar qualquer tipo de dados externos, para que esses dados sejam tratados como sequências que podem ser assinadas. Por exemplo, o exemplo do LINQ to WQL no Centro de Desenvolvedores do Rx MSDN mostra como criar um provedor simples para consultar eventos WMI usando WQL. Você pode usar os operadores LINQ de fábrica fornecidos pelo tipo Qbservable para abstrair uma sequência de eventos WMI e consultar, filtrar e redigi-los. A assinatura dessa sequência disparará a tradução da expressão de consulta LINQ para o idioma de destino, nesse caso, WQL. 

Usando a interface IQbservable para consultar dados externos

Quando menção que queremos consultar dados, primeiro nos preocupamos com o que queremos consultar. Isso pode ser uma coleção IEnumerable baseada em pull ou uma sequência observável assíncrona baseada em push. Também queremos saber onde (sob qual contexto) queremos executar a consulta. Para sequências observáveis , que são tratadas pela interface IScheduler e seus vários tipos de implementação do Agendador. Por fim, queremos saber como fazemos a consulta. Podemos representar uma consulta (uma expressão lambda) em verbatim (compilada no código IL (linguagem intermediária) do .NET), na qual cada operador na consulta será avaliado de forma linear. Esse é o caso dos métodos de operador de fábrica do tipo Observável . Ou você pode representar sua consulta usando árvores de expressão, que podem ser percorridas para obter o algoritmo representado (por exemplo, prever se um item é maior que um valor etc.), em seguida, converter o algoritmo em algum código específico do domínio, como uma instrução de consulta T-SQL para consultar um banco de dados SQL, solicitações HTTP específicas para um URI de serviço Web específico, Comandos do PowerShell, DSQLs para serviços de notificação de nuvem etc. Esse é o caso para os métodos de operador de fábrica do tipo Qbservable . O código específico do domínio traduzido pode ser executado em um sistema de destino remoto ou você pode usar a representação de árvore de expressão para fazer a otimização de consulta local.

Assim como IObservable/IObserver é uma dupla de IEnumerable/IEnumerator, IQbservable é a dupla de IQueryable e fornece uma representação de árvore de expressão de uma consulta IObservable. Você pode alterar entre os tipos IQbservable e IObservable usando os métodos AsQbservable e AsObservable. Chamar AsQbservable produz uma árvore de expressão composta por um único nó que chama a instância IObservable original. Essa relação é importante para entender por que uma consulta IQbservable completa deve ser definida a partir de uma sequência IQbservable e não pode ser obtida simplesmente chamando AsQbservable em uma consulta IQbservable existente. No exemplo a seguir, a chamada para AsQbservable produz uma árvore de consulta completa somente quando você cria a consulta aplicando IQbservable AsQbservable à fonte de dados.

var source = Observable.Interval(TimeSpan.FromSeconds(1));
var q = source.AsQbservable();
Console.WriteLine(q.ToString());
var sub = q.Subscribe(Console.WriteLine);
Console.ReadKey();

A interface IQbservable destina-se à implementação por provedores de consulta. Ele só deve ser implementado por provedores que também implementam IQbservable<T>. Se o provedor também não implementar IQbservable<T>, os operadores de consulta padrão não poderão ser usados na fonte de dados do provedor. A interface IQbservable herda a interface IObservable para que, se ela representar uma consulta, os resultados dessa consulta possam ser inscritos. A assinatura e a publicação fazem com que a árvore de expressão associada a um objeto Qbservable seja executada. A definição de "executando uma árvore de expressão" é específica para um provedor de consulta. Por exemplo, pode envolver a tradução da árvore de expressão para uma linguagem de consulta apropriada para a fonte de dados subjacente. A propriedade Expression encapsula a árvore de expressão associada à instância IQbservable , enquanto o Provedor encapsula o provedor de consulta associado à fonte de dados.

O conjunto de métodos declarados na classe Qbservable fornece uma implementação dos operadores de consulta padrão para consultar fontes de dados que implementam IQbservable. Os operadores de consulta padrão são métodos de uso geral que seguem o padrão LINQ e permitem que você expresse operações de passagem, filtro e projeção sobre dados em qualquer . Linguagem de programação baseada em NET. A maioria dos métodos nessa classe são definidos como métodos de extensão que estendem o tipo IQbservable . Isso significa que eles podem ser chamados como um método de instância em qualquer objeto que implemente IQbservable. Esses métodos que estendem o IQbservable não executam nenhuma consulta diretamente. Em vez disso, sua funcionalidade é criar um objeto Expression, que é uma árvore de expressão que representa a consulta cumulativa. Em seguida, os métodos passam a nova árvore de expressão para o método CreateQuery. A execução real da consulta nos dados de destino é executada por uma classe que implementa IQbservable.

Consulte Também

Referência

IQbservable
Qbservable

Outros recursos

Centro de Desenvolvedores do Rx MSDN