次の方法で共有


コードの移行中にデリゲートを使用してモデル間の依存関係の解決

この記事では、デリゲート インスタンスとデリゲート ハンドラ間でコントラクトを定義する手段としてデリゲート メソッドがどのように機能するかについて説明します。

概要

財務と運用は、各モデルが個別のパッケージにある、複数のモデルに分割されます。 主要な 3 つのモデルは、アプリケーション プラットフォーム、アプリケーション基盤、アプリケーション スイートです。 モデル分割を使用して、階層が作成されました。ここで上位のモデルは依存関係を持つことができ、下位のモデル内の要素にアクセスできますが、上位のモデルにはアクセスできません。 たとえば、この設定では、アプリケーション スイートはその要素、アプリケーション基盤の要素およびアプリケーション プラットフォームの要素にフル アクセスできます。 アプリケーション基準は、独自の要素とアプリケーション プラットフォームの要素にアクセスできます。 最後に、アプリケーション プラットフォームは独自の要素にのみアクセスできます。 モデルとパッケージについては、 モデル と パッケージ を参照してください。

モデルとモデル パッケージについての詳細

モデルの分割には多くの利点がありますが、上位モデルで定義された要素にアクセスするとき問題が発生します。 上位モデルの要素に下位モデルからアクセスするに、デリゲートが推奨されています。 デリゲートは、デリゲート インスタンスが呼び出されると、互換性のある署名コードを持つハンドラーが実行されるという点で、イベントと非常によく似ています。 これにより、ハンドラーである上位レイヤーコードが、デリゲート インスタンスである下位レイヤーコード (デリゲート インスタンス) によって呼び出されるようになります。

委任およびハンドラーを作成します

デリゲートの宣言には、次の 3 つが必要です。

  • 委任キーワード
  • 無効タイプ
  • 空のメソッド

デリゲート メソッドは、デリゲート インスタンスとデリゲート ハンドラー間のコントラクトを定義する手段として機能します。 デリゲートは、アクション自体を行ないません。 これは、void 型を持ち、メソッドにコードがないことによって適用されます。

delegate void applyDiscountDelegate(real _receiptTotal, EventHandlerResult _result)
{
}

メソッドに SubscribesTo キーワードを追加して、静的委任ハンドラーを作成します。 SubscribesTo にはデリゲートのクラス名、およびデリゲート メソッドの文字列名が必要です。

デリゲートが適切に処理されるには、デリゲート メソッドの宣言、デリゲート インスタンスおよびデリゲート ハンドラーに同じメソッドの署名が必要です。 たとえば、次に示すデリゲート インスタンスには、2 つの入力が必要です。実数および EventHandlerResult で、上記のデリゲート宣言およびハンドラー署名と一致するものです。

static delegate ハンドラー。

デリゲートに戻り値がないため、EventHandlerResult がパラメーターとして渡され、デリゲートが返された後に必要な結果値にアクセスできるようになります。 この記事では、SubscribesTo を使用する静的委任ハンドラーについて説明します。 Dynamics AX 2012 からのデリゲート機能が保持されます。 Dynamics AX 2012 で X++ デリゲートを使用する方法 は Dynamics AX 2012 のデリゲートの概念について、Microsoft の開発者 Marcos Calderon が MSDN に投稿した素晴らしいブログです。 これらの概念が引き続き適用されます。

シナリオ例

既存の委任のオーバーレイ

デリゲートが必要な多くの場合、以前にオーバーレイされたコードは既に Microsoft によってデリゲート ハンドラーに移動されています。 これらのインスタンスで、Microsoft は利用できるデリゲートを作成し、デリゲート ハンドラーで同様の方法でコードをオーバーレイできます。 このシナリオでは、独立系ソフトウェア ベンダー (ISV) が、LogisticsEntityPostalAddressFormHandler クラスで showSalesTax() メソッドをオーバーレイした Dynamics AX 2012 R3 からコードを移行しています。 移行後に、CodeUpgrade プロジェクトは、Your SolutionMicrosoft AX 2012Microsoft AX セクションを使用する LogisticsEntityPostalAddressFormHandler が含まれ、showSalesTax() メソッドを解決します。 コメントされた Your Solution セクションには、売上税の表示を承認するための追加のテーブルを追加することによって、showSalesTax() メソッドがオーバーレイされたことが示されています。 このオーバーレイは、赤で丸で囲まれた <isv> タグの間に表示されます。

オーバーレイが表示されます。

このオーバーレイを Dynamics AX 2012 のコードと比較するとき、これは単純な変更です。 オーバーレイによって、switch ステートメントに追加のテーブルが追加されました。

オーバーレイによって、switch ステートメントに追加のテーブルが追加されました。

ただし、財務と運用のセクションでは、Dynamics AX 2012 コード スニペットのいずれかと同じようには表示されません。

財務と運用のセクションでは、Dynamics AX 2012 コード スニペットのいずれかと同じようには表示されません。

詳細な点検を行う際、コードはデリゲート メソッド showSalesTax_delegate() を呼び出します。

詳細な点検を行う際、コードはデリゲート メソッド showSalesTax_delegate() を呼び出します。

デリゲートの使用は、コードが別の場所に移動されたことを意味します。 showSalesTax_delegate() は、アプリケーション基準で宣言され、Application Suite で処理されました。 移動されたコードを表示するには、デリゲート ハンドラを探します。 デリゲートとハンドラーの検索 セクションには、デリゲートとハンドラーを検索するメソッドがあります。 アプリケーション スイートでデリゲート ハンドラー メソッドを検索した後、showSalesTax() メソッドからから移動されたコードを参照します。 Dynamics AX 2012 で適用されているオーバーレイされた同じ変更を、デリゲート ハンドラーに適用できます。

委任とハンドラーのコード サンプルの検索。

デリゲート ハンドラーで switch ステートメントに新しいテーブルを追加した後、コードは Dynamics AX 2012 の場合と同じように機能します。

ShowSalesTax メソッド コード。

新しい委任の追加

このシナリオでは、アプリケーション スイートで作成された割引を考慮するために、アプリケーション基準に存在する既存の税計算方法を変更します。 Foundation レイヤーの次のクラスは、総額に基づいて税金を計算します。

Foundation レイヤーの次のクラスは、総額に基づいて税金を計算します。

アプリケーション スイートでは、現在の割引を含む ProductDiscount クラスを追加することで割引の概念を導入しました。

11。

Foundation レイヤー下部にある TaxCalculator クラスには、Suite レイヤーの DiscountRate へのアクセス権がないため、委任を使用して受領合計を更新し、税計算に使用する必要があります。 SimpleTax クラスでは、署名のハンドラーによって必要な状態情報とともにデリゲート メソッド applyDiscountDelegate を作成します。 デリゲート メソッドは、デリゲート インスタンスとハンドラー間のコントラクトを定義することが唯一の目的のため、常に空です。

delegate void applyDiscountDelegate(real _receiptTotal, EventHandlerResult _result)
{
} 

メモ

デリゲートの宣言、デリゲート インスタンスおよびデリゲート ハンドラーの署名は一致する必要があります。 デリゲート ハンドラーを実行するコード内の箇所に、デリゲートのインスタンスを作成することが必要になりました。 <isv> タグ間での変更は追加されたコードを表します。

calculateTotalTax メソッド。

デリゲートの環境が整い、割引情報へのアクセス権を持つアプリケーション スイート レイヤーに、ハンドラー メソッドを追加します。

applyDiscountDelegateHandler メソッド。

SubscribesTo キーワードを使用して、applyDiscountDelegateHandler メソッドを applyDiscountDelegate デリゲートにハンドラーとして結合します。

メモ

デリゲートごとに複数のハンドラーが存在する可能性があります。 ハンドラー メソッドの処理には、定義された順序はありません。 注文が重要な場合は、代行ハンドラーのペアは一緒に連鎖する必要があります。 以下の最終クラスでは、calculateTotalTax() メソッドが実行されるとき、applyDiscountDelegate が起動および処理され、receiptTotal が更新されて正確な税計算が提供されます。

完全なコード

Application Foundation Layer の SimpleTax クラス

Application Foundation Layer の SimpleTax クラス

アプリケーション スイート レイヤーの ProductDiscount クラス

ProductDiscount クラス。

委任およびハンドラーを検索します

デリゲートとハンドラーを見つける主要な 3 つの方法があります

  • メタデータ検索
  • クラス参照
  • SubscribesTo 参照

メタデータ検索と Visual Studio ページで説明されているメタデータ検索ツールは、デリゲート、またはそのハンドラーを検索するための優れた方法です。 Visual Studio で、 Dynamics 365 > メタデータ検索 に移動してメタデータ検索ツールを開きます。

Del15.

検索フィールドに、「code:<デリゲート名>」を入力して検索をコードに制限し、デリゲート名の使用を見つけると、デリゲートとハンドラーの両方を返します。 メタデータ検索は全体のコード ベースを検索し、完了に時間がかかる場合がありますが、コードにあるすべての検索用語の使用を返します。

Del16.

メソッド 2 および 3 はメタデータ検索に並行して使用できます。 デリゲートが定義されているクラスは、デリゲートまたはハンドラーの検索を絞り込む手段としても機能します。 SubscribesTo キーワードには、デリゲートが定義されているクラス名が必要です。 Visual Studio の 参照の検索 (クラス名の右クリック > 参照の検索) により、クラスを参照するファイルの一覧が返されます。 このリストには、デリゲートが宣言されているクラス定義とそのクラスを参照するハンドラーの両方が含まれます。 クラス参照の検索は完全な方法ではなく、クラス参照によるいくつかの手動検索を必要とします。 ただし、少さいサブセットのファイルが生成され、メタデータ検索よりも早くなる可能性があります。

Del17.

クラス参照の検索と同様、すべての参照の検索は、SubscribesTo キーワードで行うことができます。 結果リストには、すべての静的デリゲート ハンドラーが含まれます。 この一覧を手動で移動することで、静的デリゲート ハンドラーを検索できます。 これは、SubscribesTo キーワードを使用しない動的に宣言された代理ハンドラを返しません。

Del18.