次の方法で共有


サンプル: 汎用仮想テーブル データ プロバイダー プラグイン

対象

このサンプルでは、Dropbox ファイル共有サービス用の汎用 Microsoft Dataverse 仮想テーブル データ プロバイダー プラグイン DropboxRetrieveMultiplePlugin の最小限の実装を示します。 "ベア メタル" アプローチを使用し、カスタム ビジター クラス QueryExpression の作成を通じてを変換します。 検索条件を満たすファイルのコレクションを EntityCollectionとして返します。

このサンプルでは、アセンブリを Dataverse に登録する前に、ILMERGE を使用してプラグインアセンブリと Dropbox アセンブリを組み合わせる必要があります。 ILMERGE の使用は公式にはサポートされていません。 このサンプルを今後更新すると、ILMERGE を使用する必要はなくなります。

作業の開始

このサンプルをビルドするには、最初に Dropbox.ApiMicrosoft.CrmSdk.Data NuGet パッケージをソリューションにインストールする必要があります。 また、 DropboxClient のインスタンスを作成するときに、DropBox アカウントが必要になり、実際のアクセス トークンが渡されます。

次の using ステートメントをコードに追加します。

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

サンプル コード


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

こちらも参照ください

仮想テーブルの使用を開始する
仮想テーブルの API に関する考慮事項
カスタム仮想テーブル データ プロバイダー