次の方法で共有


インライン型のカスタム Functoid の開発

インライン型のカスタム Functoid は、参照型のカスタム Functoid のように、アセンブリ、クラス、メソッド名などを参照するのではなく、実装コードを直接マップにコピーすることによって機能を提供します。

インライン スクリプトの作成

マップに追加するためのスクリプトは、2 とおりの方法で作成できます。 カスタム Functoid のパラメーター数が可変であるかどうかに応じて、次のいずれかの方法を選択してください。

  • カスタム Functoid が可変数の入力パラメーターを受け入れ、HasVariableInputs プロパティを にtrue設定した場合は、GetInlineScriptBuffer をオーバーライドします。 たとえば、任意の数の文字列を連結したり、一連の値から最大値を探したりする場合に、この方法を使用します。

  • 可変数の入力パラメーターをサポートする必要がない場合は、 SetScriptBuffer を使用します。 パラメーターをオプションにすることもできますが、パラメーターの総数は固定されます。

    この 2 つの方法は、それぞれ実装方法が異なります。

SetScriptBuffer を使ったインライン コードの実装

インライン スクリプトを使用するようにカスタム Functoid を構成するには、次の手順に従います。

  1. Microsoft.BizTalk.BaseFunctoids.ScriptType を使用して AddScriptTypeSupport を呼び出して、インライン コードを有効にし、サポートされているスクリプトの種類を設定します。

  2. SetScriptBuffer を呼び出して、カスタム Functoid に使用するコードを設定します。 この関数は、カスタム累積 Functoid の場合は パラメーター、 functionNumber カスタムの非umulative Functoid の場合は 1 回で 3 回呼び出します。

  3. SetScriptGlobalBuffer を使用して、インライン コードで使用するグローバル変数を宣言します。

  4. RequiredGlobalHelperFunctions を使用して、カスタム インライン Functoid に必要なヘルパー関数を示します。

    スクリプトは、StringBuilder または定数を使用して作成できます。 スクリプト コードを作成する方法の 1 つとして、参照型のカスタム Functoid を最初に記述し、バグをすべて解決してから、カスタム関数を文字列定数にコピーすることによってインライン化する方法が考えられます。

GetInlineScriptBuffer を使ったインライン コードの実装

カスタム インライン Functoid で可変数のパラメーターがサポートされている場合は、 GetInlineScriptBuffer をオーバーライドします。 インライン スクリプトを使用するようにカスタム Functoid を構成するには、次の手順に従います。

  1. コンストラクターで、 HasVariableInputs を に true設定して、カスタム Functoid に変数入力があることを宣言します。

  2. コンストラクターで、Microsoft.BizTalk.BaseFunctoids.ScriptTypeAddScriptTypeSupport を呼び出してインライン コードを有効にし、サポートされているスクリプトの種類を設定します。

  3. GetInlineScriptBuffer をオーバーライドして、カスタム Functoid のマップで使用するコードを構築して返します。 パラメーターを使用して、 と numParamsをチェックして正しいコードをscriptTypeビルドします。 最後のパラメーター は functionNumber0 である必要があります。 これは、累積関数には固定数の入力があり、このメカニズムを使用しないためです。

  4. SetScriptGlobalBuffer を使用して、インライン コードで使用するグローバル変数を宣言します。

  5. RequiredGlobalHelperFunctions を使用して、カスタム インライン Functoid に必要なヘルパー関数を示します。

    次のコード フラグメントは、渡された numParams パラメーターの数を使用して C# 関数をビルドしますが、関数本体はありません。 このコードを実際に利用する場合、コード例をソリューションにコピーし、何らかの処理を行う (受け取ったパラメーターを処理して値を返す) コードを追加する必要があります。

// Override GetInlineScriptBuffer  
protected override string GetInlineScriptBuffer(ScriptType scriptType, int numParams, int functionNumber)  
{  
    // Is this one of the supported script types?  
    if(ScriptType.CSharp == scriptType)  
    {  
        // Assume functionNumber == 0  
        StringBuilder builder = new StringBuilder();  
        // Function declaration   
        builder.Append("public string MyFunction("  
        // Declare parameters using numParams  
        for(int i=0; i<numParams; i++)  
        {  
            // Separate params with a comma  
            if(i > 0)  
                builder.Append(", ");  
            // Declare parameters, param0 to paramNUMPARAM  
            builder.Append("string param" + i.ToString());  
        }  
        builder.Append(")\n");  
        // Function body; process params as needed  
        builder.Append("{\n");  
        builder.Append("}\n");  
        // Return script  
        return builder.ToString();  
    }  
    // scriptType is unsupported  
    return string.Empty;  
}  

インライン スクリプトのテスト

開発作業には常にテストが伴います。 インライン型のカスタム Functoid をテストするのは簡単ではありません。 このプロセスを簡単に行うには、次のいずれか、または両方の方法を使用してください。

  • インライン型のカスタム Functoid が使用されたマップの XSLT を調査する。

  • インライン型のカスタム Functoid が使用されたマップの入力と出力を検証する。

インライン型のカスタム Functoid が使用されたマップの XSLT を調査するには

この方法を使用すると、ロジックに関する問題や、構文に関する間違いを検出できる場合があります。 また、マップでどのようなことが行われているのかを把握する場合にも利用できます。

マップの XSLT を表示するには、次の手順に従います。

  1. Visual Studio BizTalk プロジェクトで、[ソリューション エクスプローラー] タブをクリックし、カスタム インライン Functoid を使用するマップを右クリックし、[マップの検証] をクリックします。

  2. [出力] ウィンドウをスクロールして、XSLT ファイルの URL を探します。 Ctrl キーを押し、URL をクリックすると、ファイルが表示されます。

Note

ただし、XSLT ファイルに変更を加えても、カスタム Functoid には一切反映されません。

インライン型のカスタム Functoid が使用されたマップをテストするには

これにより、マップとカスタムのインライン Functoid が期待どおりに動作するかどうかをテストします。

マップをテストするには、次の手順に従います。

  1. Visual Studio BizTalk プロジェクトで、[ソリューション エクスプローラー] タブをクリックし、カスタム インライン Functoid を使用するマップを右クリックして、[マップのテスト] をクリックします。

  2. [出力] ウィンドウをスクロールして、出力ファイルの URL を探します。 Ctrl キーを押し、URL をクリックすると、ファイルが表示されます。

    入力値と出力値をチェックして、マップが想定したとおりに動作しているかどうかを検証します。

2 つの文字列を連結するインライン型のカスタム Functoid の作成方法を次に示します。 ここでは、3 つの文字列リソースと 16x16 ピクセルのビットマップ リソースが格納されたリソース ファイルがあることを前提としています。

using System;  
using Microsoft.BizTalk.BaseFunctoids;  
using System.Reflection;  
using System.Text;  
  
namespace Microsoft.Samples.BizTalk.CustomFunctoid  
{  
    /// <summary>  
    /// Performs a string concatenation using inline code.  
    /// </summary>  
    public class CustomStringConcatFunctoid : BaseFunctoid  
    {  
        public CustomStringConcatFunctoid()  
            : base()  
        {  
            //ID for this functoid  
            this.ID = 6001;  
  
            // Resource assembly must be ProjectName.ResourceName if building with VS.Net  
            SetupResourceAssembly("Microsoft.Samples.BizTalk.CustomFunctoid.CustomFunctoidResources", Assembly.GetExecutingAssembly());  
  
            // Pass the resource ID names for functoid name, tooltip  
            // description and the 16x16 bitmap for the Map palette  
            SetName("IDS_CUSTOMSTRINGCONCATFUNCTOID_NAME");  
            SetTooltip("IDS_CUSTOMSTRINGCONCATFUNCTOID_TOOLTIP");  
            SetDescription("IDS_CUSTOMSTRINGCONCATFUNCTOID_DESCRIPTION");  
            SetBitmap("IDB_CUSTOMSTRINGCONCATFUNCTOID_BITMAP");  
  
            // Put this string handling function under the String   
            // Functoid tab in the Visual Studio toolbox for functoids  
            this.Category = FunctoidCategory.String;  
  
            // 2 required parameters, no optional parameters  
            this.SetMinParams(2);  
            this.SetMaxParams(2);  
  
            // Functoid accepts two inputs  
            AddInputConnectionType(ConnectionType.AllExceptRecord);  
            AddInputConnectionType(ConnectionType.AllExceptRecord);  
  
            // Set the output connection type  
            this.OutputConnectionType = ConnectionType.AllExceptRecord;  
  
            // Declare support for CSharp inline function and  
            // pass the method implementation to the buffer  
            AddScriptTypeSupport(ScriptType.CSharp);  
            SetScriptBuffer(ScriptType.CSharp, GetCSharpBuffer());  
        }  
  
        private string GetCSharpBuffer()  
        {  
            StringBuilder builder = new StringBuilder();  
  
            builder.Append("public string ConCatStrings(string val1, string val2)\n");  
            builder.Append("{\n");  
            builder.Append("    return val2+val1;\n");  
            builder.Append("}\n");  
  
            return builder.ToString();  
        }  
    }  
}  

参照

BaseFunctoid の使用
参照型のカスタム Functoid の開発
カスタム Functoid (BizTalk Server サンプル)