メモ
コミュニティの関心グループが Yammer から Microsoft Viva Engage に移行されました。 Viva Engage コミュニティに参加し、最新のディスカッションに参加するには、「 Finance and Operations Viva Engage Community へのアクセスを要求する 」フォームに入力し、参加するコミュニティを選択します。
この記事では、デリゲート メソッドがデリゲート インスタンスとデリゲート ハンドラーの間のコントラクトを定義する方法について説明します。
概要
財務と運用は複数のモデルに分割され、各モデルは個別のパッケージに分割されます。 3 つの主要なモデルは、Application Platform、Application Foundation、および Application Suite です。 このモデル分割により、上位のモデルが以下のモデルの要素に依存してアクセスできる階層が作成されますが、上記のモデルでは使用できません。 たとえば、Application Suite には、その要素、Application Foundation の要素、および Application Platform の要素へのフル アクセスがあります。 アプリケーションファウンデーションは、独自の要素とアプリケーションプラットフォームの要素にアクセスできます。 最後に、アプリケーション プラットフォームは独自の要素にのみアクセスできます。 モデルとパッケージについては、 モデル と パッケージ を参照してください。
モデル分割は多くの利点を提供しますが、上位のモデルで定義されている要素にアクセスしようとすると問題が発生します。 上位モデルの要素に下位モデルからアクセスするに、デリゲートが推奨されています。 デリゲートは、デリゲート インスタンスを呼び出すと、互換性のあるシグネチャ コードを持つハンドラーを実行するという点で、イベントに似ています。 この方法では、下位レイヤー コード (デリゲート インスタンス) が上位レイヤー コードであるハンドラーを呼び出すことを許可します。
デリゲートとハンドラーを作成する
デリゲートの宣言には、次の 3 つが必要です。
- 委任キーワード
- 「
void」と入力します - 空のメソッド
デリゲート メソッドは、デリゲート インスタンスとデリゲート ハンドラー間のコントラクトを定義する手段として機能します。 デリゲートは、アクション自体を行ないません。 このコントラクトは、 void 型を使用し、メソッドにコードを含めずに適用されます。
delegate void applyDiscountDelegate(real _receiptTotal, EventHandlerResult _result)
{
}
メソッドに SubscribesTo キーワードを追加して、静的委任ハンドラーを作成します。 SubscribesTo にはデリゲートのクラス名、およびデリゲート メソッドの文字列名が必要です。
デリゲートを適切に処理するには、デリゲート メソッドの宣言、デリゲート インスタンス、およびデリゲート ハンドラーに 同じ メソッド シグネチャが必要です。 たとえば、次のコードのデリゲート インスタンスは、デリゲート宣言とハンドラーシグネチャに一致する 2 つの入力 (実数と EventHandlerResult) を受け取ります。
デリゲートには戻り値がないため、デリゲートが戻った後に必要な結果値へのアクセスを提供するパラメーターとして EventHandlerResult が渡されます。 この記事では、 SubscribesTo キーワードを使用する静的デリゲート ハンドラーについて説明します。 Dynamics AX 2012 からのデリゲート機能が保持されます。
Dynamics AX 2012 で X++ デリゲートを使用する方法は、Dynamics AX 2012 のデリゲートの概念について説明する Microsoft 開発者の Marcos Calderon による MSDN の優れたブログ投稿です。 これらの概念が引き続き適用されます。
シナリオ例
既存のデリゲートのオーバーレイ
デリゲートが必要な多くの場合、Microsoft は、以前にオーバーレイしたコードをデリゲート ハンドラーに既に移動しました。 これらのインスタンスでは、Microsoft が作成したデリゲートを利用し、デリゲート ハンドラーでコードをオーバーレイできます。 このシナリオでは、独立系ソフトウェア ベンダー (ISV) が Dynamics AX 2012 R3 からコードを移行し、showSalesTax() クラスのLogisticsEntityPostalAddressFormHandler メソッドを重ね合わせます。 移行後、CodeUpgrade プロジェクトは、Your Solution、Microsoft AX 2012、Microsoft AX のセクションを含むLogisticsEntityPostalAddressFormHandler を持ち、これらはshowSalesTax() メソッドで解決が必要です。 コメントされた Your Solution セクションには、売上税の表示を承認するための追加のテーブルを追加することによって、showSalesTax() メソッドがオーバーレイされたことが示されています。 このオーバーレイは、次の図の <isv> タグの間に赤で囲まれています。
このオーバーレイを Dynamics AX 2012 のコードと比較すると、これは単純な変更であることがわかります。 オーバーレイにより、switch ステートメントに追加のテーブルが追加されます。
ただし、財務と運用のセクションは、Dynamics AX 2012 コード スニペットのいずれにも似ていません。
より詳細な検査の後、コードはデリゲート メソッドを呼び出 showSalesTax_delegate()。
デリゲートの使用は、コードが別の場所に移動されることを意味します。
showSalesTax_delegate()は Application Foundation で宣言され、Application Suite で処理されます。 移動されたコードを表示するには、デリゲート ハンドラーを見つけます。
デリゲートとハンドラーの検索 セクションには、デリゲートとハンドラーを検索するメソッドがあります。 Application Suite でデリゲート ハンドラー メソッドが見つかると、 showSalesTax() メソッドから移動されたコードが表示されます。 Dynamics AX 2012 で適用したのと同じオーバーレイされた変更をデリゲート ハンドラーに適用できます。
デリゲート ハンドラーの switch ステートメントに新しいテーブルを追加すると、コードは Dynamics AX 2012 と同様に機能します。
新しい代理の追加
このシナリオでは、Application Foundation レイヤーの既存の税計算方法を変更して、Application Suite レイヤーで作成された割引を考慮します。 Foundation レイヤーの次のクラスは、総額に基づいて税金を計算します。
Application Suite では、現在の割引を含む ProductDiscount クラスを追加することで、割引の概念を紹介します。
下位の Foundation レイヤーの TaxCalculator クラスは、Suite レイヤーの DiscountRate にアクセスできません。 税計算で使用する領収書の合計を更新するには、代理人を使用する必要があります。 SimpleTax クラスでは、デリゲート メソッド applyDiscountDelegate を作成し、ハンドラーがシグネチャに必要とする状態情報を指定します。 デリゲート メソッドは、デリゲート インスタンスとハンドラー間のコントラクトを定義することが唯一の目的のため、常に空です。
delegate void applyDiscountDelegate(real _receiptTotal, EventHandlerResult _result)
{
}
メモ
デリゲートの宣言、デリゲート インスタンスおよびデリゲート ハンドラーの署名は一致する必要があります。 次に、デリゲート ハンドラーを実行するコード内のポイントでデリゲートのインスタンスを作成する必要があります。 <isv> タグ間の変更は、追加されたコードを表します。
デリゲートを配置した状態で、割引情報にアクセスできるハンドラー メソッドを Application Suite レイヤーに追加します。
SubscribesTo キーワードを使用すると、applyDiscountDelegateHandler メソッドを applyDiscountDelegate デリゲートのハンドラーとして関連付けます。
メモ
デリゲートごとに複数のハンドラーが存在する可能性があります。 ハンドラー メソッドの処理に定義された順序 はありません 。 順序が重要な場合は、デリゲート ハンドラーペアを連結します。 次の最終クラスを使用して、calculateTotalTax() メソッドを実行すると、applyDiscountDelegate が起動して処理を行い、receiptTotal を更新して正確な税額を計算します。
完全なコード
Application Foundation Layer の SimpleTax クラス
アプリケーション スイート レイヤーの ProductDiscount クラス
デリゲートとハンドラーを検索します
デリゲートとハンドラーは、次の 3 つの主要なメソッドを使用して見つけることができます。
- メタデータ検索
- クラス参照
- SubscribesTo 参照
最適な結果を得るには、Visual Studio のメタデータ検索で説明されている メタデータ検索ツールを使用します。 Visual Studio で、 Dynamics 365 > メタデータ検索 に移動してメタデータ検索ツールを開きます。
検索フィールドに「 code:<delegate name>」と入力します。 この検索用語は、検索をコードに制限し、デリゲート名の使用を検索します。 この検索では、デリゲートとハンドラーの両方が返されます。 メタデータ検索はコード ベース全体を検索し、完了するまでに時間がかかる場合がありますが、コード内で検索用語を使用すると返されます。
メタデータ検索と並行して、メソッド 2 と 3 を使用できます。 デリゲートが定義されているクラスは、デリゲートまたはハンドラーの検索を絞り込むのにも役立ちます。
SubscribesTo キーワードには、デリゲートが定義されたクラス名が必要です。 Visual Studio の 検索参照 (クラス名を右クリック > 参照を検索) は、クラスを参照するファイルの一覧を返します。 このリストには、デリゲートが宣言されているクラス定義と、クラスを参照するハンドラーの両方が含まれます。 クラス参照の検索は完璧なメソッドではなく、クラス参照を手動で検索する必要があります。 ただし、少さいサブセットのファイルが生成され、メタデータ検索よりも早くなる可能性があります。
クラス参照の検索と同様に、 SubscribesTo キーワードのすべての参照を検索できます。 結果の一覧には、すべての静的デリゲート ハンドラーが含まれます。 この一覧を手動で実行すると、静的デリゲート ハンドラーを検索する別の方法が提供されます。 この一覧には、 SubscribesTo キーワードを使用しない動的に宣言されたデリゲート ハンドラーは含まれません。