カスタム インライン Functoid は、アセンブリ、クラス、およびカスタム参照 Functoid のようなメソッド名を参照することではなく、実装コードをマップに直接コピーすることで機能を提供します。
インライン スクリプトのビルド
マップに含めるためのスクリプトを提供するには、2 つの方法があります。 カスタム Functoid が可変数のパラメーターをサポートしているかどうかに基づいて、次のメソッドから選択します。
カスタム Functoid が可変数の入力パラメーターを受け取り、HasVariableInputs プロパティを
true
に設定している場合は、GetInlineScriptBuffer をオーバーライドします。 たとえば、可変数の文字列を連結する場合や、一連の値で最大値を検索する場合は、このメソッドを使用します。可変数の入力パラメーターをサポートする必要がない場合は、 SetScriptBuffer を使用します。 省略可能なパラメーターは引き続き使用できますが、パラメーターの合計数は固定されています。
これら 2 つのメソッドには、異なる実装が必要です。
SetScriptBuffer を使用したインライン コードの提供
インライン スクリプトを使用するようにカスタム Functoid を構成するには:
Microsoft.BizTalk.BaseFunctoids.ScriptType で AddScriptTypeSupport を呼び出してインライン コードを有効にし、サポートされているスクリプトの種類を設定します。
SetScriptBuffer を呼び出して、カスタム Functoid に使用するコードを設定します。 この関数は、カスタム累積ファンクトイドの場合には
functionNumber
パラメーターを使用して3回、カスタム非累積ファンクトイドの場合には1回呼び出します。SetScriptGlobalBuffer を使用して、インライン コードで使用するグローバル変数を宣言します。
RequiredGlobalHelperFunctions を使用して、カスタム インライン Functoid に必要なヘルパー関数を示します。
StringBuilder または定数を使用してスクリプトをビルドできます。 スクリプト コードを記述する方法の 1 つは、最初にカスタム参照 Functoid を記述し、すべてのバグが排除されたら、関数を文字列定数にコピーしてインラインに変換することです。
GetInlineScriptBuffer を使用してインライン コードを提供する
カスタム インライン Functoid で可変数のパラメーターがサポートされている場合は、 GetInlineScriptBuffer をオーバーライドします。 インライン スクリプトを使用するようにカスタム Functoid を構成するには:
コンストラクターで、 HasVariableInputs を
true
に設定して、カスタム Functoid に変数入力があることを宣言します。コンストラクターで、Microsoft.BizTalk.BaseFunctoids.ScriptType で AddScriptTypeSupport を呼び出してインライン コードを有効にし、サポートされているスクリプトの種類を設定します。
GetInlineScriptBuffer をオーバーライドして、カスタム Functoid のマップで使用するコードを構築して返します。 パラメーターを使用して、
scriptType
とnumParams
を確認して正しいコードをビルドします。 最後のパラメーター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 を使用するマップの XSLT を調べます。
カスタム インライン Functoid を使用するマップの入力と出力を確認します。
カスタム インライン Functoid を使用するマップの XSLT を調べる
この手法は、多くの場合、ロジックまたは微妙な構文の問題を明らかにします。 また、マップで何が起こるかを理解するのにも役立ちます。
マップの XSLT を表示するには:
Visual Studio BizTalk プロジェクトで、[ ソリューション エクスプローラー ] タブをクリックし、カスタム インライン Functoid を使用するマップを右クリックし、[マップの 検証] をクリックします。
[出力] ウィンドウをスクロールして、XSLT ファイルの URL を見つけます。 Ctrl キーを押し、URL をクリックしてファイルを表示します。
注
XSLT ファイルに加えられた変更は、カスタム Functoid には反映されないことに注意してください。
カスタム インライン Functoid を使ったマップのテストを行う
これにより、マップとカスタムインライン Functoid が期待どおりに動作するかどうかをテストします。
マップをテストするには:
Visual Studio BizTalk プロジェクトで、[ ソリューション エクスプローラー ] タブをクリックし、カスタム インライン Functoid を使用するマップを右クリックし、[マップの テスト] をクリックします。
[出力] ウィンドウをスクロールして、出力ファイルの URL を見つけます。 Ctrl キーを押し、URL をクリックしてファイルを表示します。
入力値と出力値を確認して、マップが期待どおりに動作したことを確認できます。
例
次の例は、2 つの文字列を連結するためのカスタム インライン Functoid を作成する方法を示しています。 これは、3 つの文字列リソースと 16 x 16 ピクセルのビットマップ リソースを含むリソース ファイルに依存します。
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 の開発
カスタムファンクトイド (BizTalk Server サンプル)