Compartilhar via


Exemplo: plug-in genérico do provedor de dados para tabela virtual

Demonstrações

Este exemplo mostra uma implementação mínima para um plug-in genérico do provedor de dados de tabela virtual do Microsoft Dataverse, DropboxRetrieveMultiplePlugin, para o serviço de compartilhamento de arquivos dropbox . Ele usa a abordagem "bare metal", traduzindo o QueryExpression por meio da criação da classe de visitante personalizada, DropBoxExpressionVisitor. Ele retorna uma coleção de arquivos que atendem aos critérios de pesquisa como um EntityCollection.

Observação

Este exemplo requer o uso de ILMERGE para combinar os assemblies do plug-in e do Dropbox antes de registrar o assembly com o Dataverse. Não há suporte oficial para o uso do ILMERGE. Uma atualização futura para este exemplo removerá a necessidade de usar ILMERGE.

Como começar

Para criar este exemplo, primeiro você deve instalar os pacotes Dropbox.Api e Microsoft.CrmSdk.Data NuGet em sua solução. Você também precisará de uma conta do DropBox e passar um token de acesso real ao criar uma instância do DropboxClient.

Adicione as seguintes instruções de uso ao seu código:

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Dropbox.Api;
using Dropbox.Api.Files;

Código de exemplo


public class DropBoxExpressionVisitor : QueryExpressionVisitorBase
{
    public string SearchKeyWords { get; private set; }

    public override QueryExpression Visit(QueryExpression query)
    {
        // Very simple visitor that extracts search keywords
        var filter = query.Criteria;
        if (filter.Conditions.Count > 0)
        {
            foreach (ConditionExpression condition in filter.Conditions)
            {
                if (condition.Operator == ConditionOperator.Like && condition.Values.Count > 0)
                {
                    string exprVal = (string)condition.Values[0];

                    if (exprVal.Length > 2)
                    {
                        this.SearchKeyWords += " " + exprVal.Substring(1, exprVal.Length - 2);
                    }
                }
            }
            return query;
        }
    }
}

public class DropboxRetrieveMultiplePlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
        var qe = (QueryExpression)context.InputParameters["Query"];
        if (qe != null)
        {
            var visitor = new DropBoxExpressionVisitor();
            qe.Accept(visitor);
            using (var dbx = new DropboxClient(AccessToken))
            {
                if (visitor.SearchKeyWords != string.Empty)
                {
                    var searchCriteria = new SearchArg(string.Empty, visitor.SearchKeyWords);
                    var task = Task.Run(() => this.SearchFile(dbx, searchCriteria));
                    context.OutputParameters["BusinessEntityCollection"] = task.Result;
                }
            }
        }
    }

    public async Task<EntityCollection> SearchFile(DropboxClient dbx, SearchArg arg)
    {
        EntityCollection ec = new EntityCollection();
        var list = await dbx.Files.SearchAsync(arg);
        foreach (var item in list.Matches)
        {
            if (item.Metadata.IsFile)
            {
                Entity e = new Entity("new_dropbox");
                e.Attributes.Add("new_dropboxid", Guid.NewGuid());
                e.Attributes.Add("new_filename", item.Metadata.AsFile.Name);
                e.Attributes.Add("new_filesize", item.Metadata.AsFile.Size);
                e.Attributes.Add("new_modifiedon", item.Metadata.AsFile.ServerModified);
                ec.Entities.Add(e);
            }
        }
        return ec;
    }
}

Consulte também

Introdução às tabelas virtuais
Considerações de API de tabelas virtuais
Provedores de dados de tabela virtual personalizados