Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

【C#】【Dynamics CRM】Pluginの作成(概要)

今までいくつかのプロジェクトでDynamics CRM のPluginを作成してきたけども、認識として曖昧な部分もあったので、改めて全体的な内容を確認し直して、書き留めておきたいと思います。

Dynamics CRM におけるPluginの概要

Dynamics CRMではレコードの作成時や更新時といったイベント処理タイミングにPluginという形で、C#VBで記述したプログラムを追加することが可能です。

例えば、電話のレコードが作成された際に、合わせて後続のタスクレコードを作成する。 取引先企業レコード作成時に電話番号が入力されていれば、電話レコードを作成する。 取引先担当者が更新されたら、メール通知を行う、など。

Dynamics CRMではCRMの画面上からワークフローという連携処理を作成することも可能ですので、上記に示した例はワークフローでも実現可能です。

ですが、GUI上から作成するワークフロー以上に自由度が高いことは言うまでもないと思います。(もちろんそれなりの制限もありますが)

他のシステム(SharePointなど)と連携したり、SQL Serverに問い合わせをかける、Azureの通知サービスを利用するなど、Dynamics CRM以外での処理も想定することが可能になります。

blogs.msdn.com

Plugin処理・登録について

Dynamics CRMでは例えばCreateやUpdate(GUIから、プログラムから問わず)の処理が行われる際、 Dynamics CRMのサーバーではMessageという形で要求が認識され、その処理はイベント実行パイプラインで実行されます。

イベント実行パイプライン

イベント実行パイプラインは全部で4つのステージに別れ、下記のように定義されています。(Dynamics CRM 4.0では50番もありましたが、廃止された模様)

ステージ 10 Pre-Validation

Plugin登録 ○

トランザクション:外部

ステージ 20 Pre-Operation

Plugin登録 ○

トランザクション:内部

ステージ 30 Main-Operation

Plugin登録 -

トランザクション:内部

ステージ 40 Post-Oparation

Plugin登録 ○

トランザクション:内部

Pluginはこのイベント実行パイプラインの30番を除く各所に登録することができます。

ステージによって、トランザクションに属するかどうかが決まり、処理が失敗した場合のロールバック可否などが変わります。

各Message

Messgaeはそれぞれのエンティティによって、Pluginを登録できるMessageが違ってきます。(主に既定で作成されているエンティティは色々と特殊なMessageがあります)

詳しくはSDKに含まれている【Message-entity support for plug-ins.xlsx】を参照していただくのがいいと思いますが、ここでは利用頻度が高いものが含まれ、かつCustomエンティティで利用可能なメッセージを記載しておきます。

・Assign

・Create

・Delete

・GrantAccess

・ModifyAccess

・Retrieve

・RetrieveMultiple

・RetrievePrincipalAccess

・RetrieveSharedPrincipalsAndAccess

・RevokeAccess

・SetState

・SetStateDynamicEntity

・Update

たぶん、Pluginを利用する際に最も利用頻度が高いのは【Create・レコード作成時】【Delete・レコード削除時】【Update・レコード更新時】あたりだと思います。

それ以外にも、Retrieve(フォームを開く際など単一レコードの問い合わせ) RetrieveMultiple(ビューや高度な検索など、一覧を表示する際のメッセージ)にもPluginは登録することが可能です。(可能ですが、かなり普段の利用シーンが多いため、通常利用シーンでの影響が懸念されます)

同期・非同期

Pluginはそれぞれ同期・非同期を選択して登録することが可能です。

非同期Pluginとして登録されると、Dynamics CRMのシステムジョブに非同期ジョブとして登録され、Pluginの処理が行われます。

もちろん、レコードの作成などの処理は、イベントパイプラインのMain-Operationで処理されてしまうため、CreateMessageのキャンセルなどは行われなくなります。

ただ、Dynamics CRMのPluginには実行時間が2分以内でなければいけないという制限が存在します。

なので、サブ処理は分散して、非同期ジョブとして動くようにする、などの工夫が必要になってきます。

MSDNでのベストプラクティスとしては10秒以内に処理を終了するようにとの、記述もあります)

サンドボックスへの登録(部分信頼・完全信頼)

プラグインサンドボックス内に登録するかどうかを選ぶことが可能です。

サンドボックスに登録されたものを部分信頼 外に登録されたものを完全信頼とDynamics CRMでは呼んでおり、

サンドボックス外に登録すると、ローカルリソースなどへのアクセスが可能になります。 (サーバー上のCSVファイルを読み取る、など)

ただし、完全信頼Pluginはオンプレミスのみ対応可能なもので、Online環境では利用できないので、注意する必要があります。

blogs.msdn.com

まとめ

とりあえず、Pluginの全体的な概要や注意点などをまとめてみました。

改めて、MSDNのベストプラクティスを見渡すと、結構抜けていたなぁと思える部分が多々ありました。

次回以降、実際のプラグインプログラムも交えながら、内容を追っていきたいと思います。

■Dynamics CRM Pluginにおけるベストプラクティス

プラグインの開発

Microsoft Dynamics CRM での開発におけるベスト プラクティス