インライン型のカスタム Functoid の開発
インライン型のカスタム Functoid は、参照型のカスタム Functoid のように、アセンブリ、クラス、メソッド名などを参照するのではなく、実装コードを直接マップにコピーすることによって機能を提供します。
インライン スクリプトの作成
マップに追加するためのスクリプトは、2 とおりの方法で作成できます。 カスタム Functoid のパラメーター数が可変であるかどうかに応じて、次のいずれかの方法を選択してください。
カスタム Functoid が可変数の入力パラメーターを受け入れ、HasVariableInputs プロパティを に
true
設定した場合は、GetInlineScriptBuffer をオーバーライドします。 たとえば、任意の数の文字列を連結したり、一連の値から最大値を探したりする場合に、この方法を使用します。可変数の入力パラメーターをサポートする必要がない場合は、 SetScriptBuffer を使用します。 パラメーターをオプションにすることもできますが、パラメーターの総数は固定されます。
この 2 つの方法は、それぞれ実装方法が異なります。
SetScriptBuffer を使ったインライン コードの実装
インライン スクリプトを使用するようにカスタム Functoid を構成するには、次の手順に従います。
Microsoft.BizTalk.BaseFunctoids.ScriptType を使用して AddScriptTypeSupport を呼び出して、インライン コードを有効にし、サポートされているスクリプトの種類を設定します。
SetScriptBuffer を呼び出して、カスタム Functoid に使用するコードを設定します。 この関数は、カスタム累積 Functoid の場合は パラメーター、
functionNumber
カスタムの非umulative Functoid の場合は 1 回で 3 回呼び出します。SetScriptGlobalBuffer を使用して、インライン コードで使用するグローバル変数を宣言します。
RequiredGlobalHelperFunctions を使用して、カスタム インライン Functoid に必要なヘルパー関数を示します。
スクリプトは、StringBuilder または定数を使用して作成できます。 スクリプト コードを作成する方法の 1 つとして、参照型のカスタム Functoid を最初に記述し、バグをすべて解決してから、カスタム関数を文字列定数にコピーすることによってインライン化する方法が考えられます。
GetInlineScriptBuffer を使ったインライン コードの実装
カスタム インライン Functoid で可変数のパラメーターがサポートされている場合は、 GetInlineScriptBuffer をオーバーライドします。 インライン スクリプトを使用するようにカスタム Functoid を構成するには、次の手順に従います。
コンストラクターで、 HasVariableInputs を に
true
設定して、カスタム Functoid に変数入力があることを宣言します。コンストラクターで、Microsoft.BizTalk.BaseFunctoids.ScriptType で AddScriptTypeSupport を呼び出してインライン コードを有効にし、サポートされているスクリプトの種類を設定します。
GetInlineScriptBuffer をオーバーライドして、カスタム Functoid のマップで使用するコードを構築して返します。 パラメーターを使用して、 と
numParams
をチェックして正しいコードをscriptType
ビルドします。 最後のパラメーター はfunctionNumber
0 である必要があります。 これは、累積関数には固定数の入力があり、このメカニズムを使用しないためです。SetScriptGlobalBuffer を使用して、インライン コードで使用するグローバル変数を宣言します。
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 を表示するには、次の手順に従います。
Visual Studio BizTalk プロジェクトで、[ソリューション エクスプローラー] タブをクリックし、カスタム インライン Functoid を使用するマップを右クリックし、[マップの検証] をクリックします。
[出力] ウィンドウをスクロールして、XSLT ファイルの URL を探します。 Ctrl キーを押し、URL をクリックすると、ファイルが表示されます。
Note
ただし、XSLT ファイルに変更を加えても、カスタム Functoid には一切反映されません。
インライン型のカスタム Functoid が使用されたマップをテストするには
これにより、マップとカスタムのインライン Functoid が期待どおりに動作するかどうかをテストします。
マップをテストするには、次の手順に従います。
Visual Studio BizTalk プロジェクトで、[ソリューション エクスプローラー] タブをクリックし、カスタム インライン Functoid を使用するマップを右クリックして、[マップのテスト] をクリックします。
[出力] ウィンドウをスクロールして、出力ファイルの 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 サンプル)