Partager via


Exemple : Plug-in générique fournisseur de données des tables virtuelles

Montre ce qui suit

Cet exemple montre une implémentation minimale pour un plug-in de fournisseur de données de table virtuelle Microsoft Dataverse générique, DropboxRetrieveMultiplePlugin, pour le service de partage de fichiers Dropbox . Il utilise l’approche « complète », traduisant QueryExpression à travers la création de la classe de visiteur personnalisée, DropBoxExpressionVisitor. Il renvoie un ensemble des fichiers qui répondent aux critères de recherche en tant que EntityCollection.

Note

Cet exemple nécessite l’utilisation d’ILMERGE pour combiner les assemblies du plug-in et de Dropbox avant d’enregistrer l'assemblage dans Dataverse. L’utilisation d’ILMERGE n’est pas officiellement prise en charge. Une prochaine mise à jour de cet exemple supprime la nécessité d’utiliser ILMERGE.

Mise en route

Pour générer cet exemple, commencez par installer les packages Dropbox.Api et Microsoft.CrmSdk.Data NuGet dans votre solution. Vous devez également disposer d’un compte Dropbox et fournir un vrai jeton d’accès lors de la création d’une instance DropboxClient.

Ajoutez ce qui suit à l’aide d’instructions dans votre code :

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

Exemple de code


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

Voir aussi

Commencez avec les tables virtuelles
Considérations relatives à l’API des tables virtuelles
Fournisseurs de données de table virtuelle personnalisée