EventHandlerResult を使用して応答

Note

コミュニティの関心グループが Yammer から Microsoft Viva Engage に移行されました。 Viva Engage コミュニティに参加し、最新のディスカッションに参加するには、「 Finance and Operations Viva Engage Community へのアクセスを要求する 」フォームに入力し、参加するコミュニティを選択します。

一部のデリゲート メソッドは、サブスクライブデリゲート ハンドラー メソッドからの応答を要求します。 デリゲート呼び出しロジックは、応答の受信後に実行を続行するときに、潜在的なサブスクライバーからの応答を使用します。 これらのデリゲート メソッドは通常、EventHandlerResult パラメーターを最後のパラメーターとして持つシグネチャを持っています。 ただし、EventHandlerAcceptResult および EventHandlerRejectResult タイプのサポートが原因で、パラメーターは IEventHandlerResult インターフェイスを実装する任意のタイプになります。

  • 一般に、デリゲート ハンドラー メソッドに実装されるロジックには、サブスクライブ ロジックが応答の提供を担当していることを確認する条件が含まれている必要があります。 結果のフォームに応答を提供するロジックも含める必要があります。
  • デリゲート ハンドラー メソッドが EventHandlerResult オブジェクト パラメーターへの応答を提供する必要があるとき、サブスクライブするロジックには結果の計算または取得のためのロジックも含まれている場合があります。
  • 条件と応答ロジックが実装されている場合は、条件が true の場合にのみ結果を計算します。
  • サブスクライブしているすべてのデリゲート ハンドラー メソッドは、デリゲートが呼び出されたときに実行されます。 そのため、メソッドが応答を提供する責任がない場合は、メソッドを実行するオーバーヘッドができるだけ少ないことを確認してください。 デリゲート ハンドラー メソッドが結果を提供する責任がない場合は、可能な限り迅速に条件が false に評価されていることを確認します。

例示

次の例は、switch ステートメントの形式の条件を持つデリゲート ハンドラーを示しています。 デリゲート ハンドラーには結果のフォームに応答を提供するロジックがあります。 応答ロジックは、条件が true の場合にのみ実行されます。

[SubscribesTo(tableStr(InventWarehouseEntity), delegateStr(InventWarehouseEntity, validateWarehouseTypeDelegate))]
public static void validateWarehouseTypeIsSupportedStandardDelegateHandler(InventLocationType _inventLocationType, EventHandlerResult _result)
{
    switch (_inventLocationType)
    {
        case InventLocationType::Standard:
        case InventLocationType::Quarantine:
        case InventLocationType::Transit:
            _result.result(true);
            break;
    }
}

デリゲート メソッドが、EventHandlerAcceptResult または EventHandlerRejectResult オブジェクト パラメーターを使用して、応答を要求するとき、サブスクライバーは、承認または否認でのみ応答することを想定します。 サブスクライブ ロジックは、メッセージを Infolog に追加することもできます。

次の例は、前の例に似ています。 ただし、デリゲート メソッドは、EventHandlerAcceptResult オブジェクトの使用によりおよび受け入れメソッドを呼び出すことにより、応答を要求するようになります。

[SubscribesTo(tableStr(InventWarehouseEntity), delegateStr(InventWarehouseEntity, validateWarehouseTypeDelegate))]
public static void validateWarehouseTypeIsSupportedStandardDelegateHandler(InventLocationType _inventLocationType, EventHandlerAcceptResult _result)
{
    switch (_inventLocationType)
    {
        case InventLocationType::Standard:
        case InventLocationType::Quarantine:
        case InventLocationType::Transit:
            _result.accept();
            break;
    }
}

次の例では、EventHandlerRejectResult オブジェクトを使用して応答するデリゲート ハンドラー メソッドを示しています。 EventHandlerRejectResult オブジェクトを使用して応答するには、reject メソッドまたは checkFailed 拡張メソッドを呼び出します。 checkFailed メソッドを使用する場合は、情報ログに警告メッセージを追加できます。 内部的には、checkFailed メソッドは reject メソッドを呼び出します。

[SubscribesTo(classStr(ProdTableType), delegateStr(ProdTableType, validateWriteProdTableInventRefTypeDelegate))]
public static void validateWriteProdTableInventRefTypeDelegateHandler(ProdTable _prodTable, EventHandlerRejectResult _result)
{
    if (_prodTable.InventRefType == InventRefType::ProdLine)
    {
        if (! _prodTable.InventRefId || !_prodTable.InventRefTransId)
        {
            _result.checkFailed("@SYS19558");
        }
        ProdBOM prodBOM;
        select prodBOM
            where prodBOM.InventTransId  == _prodTable.InventRefTransId;
        if (! _prodTable.checkRefProdBOM(prodBOM))
        {
            _result.reject();
        }
    }
}

ガイドライン

前述のプラクティスに加えて、次の一般的なガイドラインに従ってください。

  • サブスクライブしているロジックが応答を担当する場合にのみ対応します。 特定の条件が満たされたときに応答を提供するデリゲート ハンドラー メソッドを実装します。 したがって、サブスクライブしているロジックは、特定の条件が満たされた場合に結果を提供する必要があります。 サブスクライブ ロジックが応答する前に、結果オブジェクト パラメーターに既に結果が含まれているかどうかを評価しないでください。 たとえば、デリゲート ハンドラー メソッドには、次の例のロジックに似たロジックを含めることはできません。 このロジックは、メソッドの実行時に EventHandlerResult オブジェクト パラメーターに既に結果が含まれているかどうかを評価します。

    Warnung

    この例では、書くべきでないコードを示します。

    [SubscribesTo(tableStr(InventWarehouseEntity), delegateStr(InventWarehouseEntity, validateWarehouseTypeDelegate))]
    

public static void validateWarehouseTypeIsSupportedStandardDelegateHandler(InventLocationType _inventLocationType, EventHandlerResult _result) { // このif文は悪い慣行の例です。 if (_result.hasResult()) { return; } switch (_inventLocationType) { case InventLocationType::Standard: case InventLocationType::Quarantine: case InventLocationType::Transit: _result.result(true); break; } } }```

  • 他のサブスクライバーの代理として応答を提供しないでください。 デリゲート ハンドラー メソッドが応答を提供する責任がない場合は、デリゲート ハンドラー メソッドが応答を提供してはなりません。 条件が満たされていないときに、メソッドが応答を提供する場合は、他のサブスクライバーに代わって応答を提供しています。 要求ロジックは、サブスクライバーが応答しない状況を処理する必要があります。 デリゲート ハンドラー メソッドは、次の例にあるロジックに似たロジックを含めないようにする必要があります。 このロジックは、条件が false の場合に結果を提供 します

    Warnung

    この例では、書くべきでないコードを示します。

[SubscribesTo(tableStr(InventWarehouseEntity), delegateStr(InventWarehouseEntity, validateWarehouseTypeDelegate))] public static void validateWarehouseTypeIsSupportedStandardDelegateHandler(InventLocationType _inventLocationType, EventHandlerResult _result) { switch (_inventLocationType) { case InventLocationType::Standard: case InventLocationType::Quarantine: case InventLocationType::Transit: _result.result(true); break; // この既定のブロックは、不適切なプラクティスの例です default: _result.result(false); break; } } ```