開發自訂內嵌運算質
自訂內嵌運算質藉由直接複製實作程式碼到對應中,以提供功能,而不是像自訂參考運算質一樣參考組件、類別和方法名稱。
建置內嵌指令碼
有兩種方式可以提供指令碼包含在對應中。 根據您的自訂運算質是否可支援不同數量的參數,從下列方法選擇:
當您的自訂運算質接受可變數目的輸入參數,而且您已將HasVariableInputs屬性設定為
true
時,覆寫GetInlineScriptBuffer。 例如,若您要串連不同數量的字串或尋找一組值中的最大值,即可使用此方法。當您不需要支援可變數目的輸入參數時,請使用 SetScriptBuffer 。 您還是可以使用選擇性的參數,但參數的總數是固定的。
這兩種方法需要不同的實作。
提供具有 SetScriptBuffer 的內嵌程式碼
將您的自訂運算質設定為使用內嵌指令碼:
使用Microsoft.BizTalk.BaseFunctoids.ScriptType呼叫AddScriptTypeSupport以啟用內嵌程式碼並設定支援的腳本類型。
叫用 SetScriptBuffer 以設定要用於自訂運算質的程式碼。 您將針對自訂累計運算質使用
functionNumber
參數呼叫此函式三次,一次用於自訂非重複運算質。使用 SetScriptGlobalBuffer 宣告內嵌程式碼使用的任何全域變數。
使用 RequiredGlobalHelperFunctions 來指出自訂內嵌運算質所需的協助程式函式。
您可以使用 StringBuilder 或常數建置您的指令碼。 撰寫指令碼的一個方法是先撰寫自訂參考運算質,排除所有錯誤之後,複製您的運算質到字串常數,以將它轉換為內嵌。
提供具有 GetInlineScriptBuffer 的內嵌程式碼
如果您的自訂內嵌運算質支援可變數目的參數,您將覆寫 GetInlineScriptBuffer。 將您的自訂運算質設定為使用內嵌指令碼:
在建構函式中,宣告您的自訂運算質具有變數輸入,方法是將 HasVariableInputs 設定為
true
。在建構函式中,使用Microsoft.BizTalk.BaseFunctoids.ScriptType呼叫AddScriptTypeSupport,以啟用內嵌程式碼並設定支援的腳本類型。
覆寫 GetInlineScriptBuffer 以建構並傳回程序代碼,以用於自訂運算質的對應中。 藉由檢查
scriptType
和numParams
,使用 參數來建置正確的程式碼。 最後的參數functionNumber
應該是 0。 這是因為累積函式具有固定數目的輸入,而且不會使用此機制。使用 SetScriptGlobalBuffer 來宣告內嵌程式碼所使用的全域變數。
使用 RequiredGlobalHelperFunctions 來指出自訂內嵌運算質所需的協助程式函式。
下列程式碼片段會建置 C# 函式,其中包含傳入
numParams
但不含函式主體的參數數目。 若要使用此程式碼片段,可將範例複製到您的解決方案,再新增程式碼以參數執行動作並傳回值。
// 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;
}
測試內嵌指令碼
測試在所有開發工作中都是重要的考量。 自訂內嵌運算質可接受測試。 若要簡化此程序,可使用下列的一種或兩種技術:
檢查使用自訂內嵌運算質的對應之 XSLT。
驗證使用自訂內嵌運算質的對應之輸入和輸出。
檢查使用自訂內嵌運算質的對應之 XSLT
此技術通常可以發現邏輯問題或較容易忽略的語法問題。 也可以協助您瞭解對應中所發生的事。
檢視對應的 XSLT:
從 Visual Studio BizTalk 專案,按一下[方案總管]索引標籤,以滑鼠右鍵按一下使用自訂內嵌運算質的對應,然後按一下 [驗證對應]。
捲動至 [輸出] 視窗,以尋找 XSLT 檔案的 URL。 按 CTRL 再按一下 URL,以檢視檔案。
注意
請記住,對 XSLT 檔案所做的任何變更都不會反映在您的自訂運算質中。
測試使用自訂內嵌運算質的對應
這會測試對應和自訂內嵌運算質是否如預期運作。
測試對應:
從 Visual Studio BizTalk 專案,按一下[方案總管] 索引標籤,以滑鼠右鍵按一下使用自訂內嵌運算質的對應,然後按一下 [測試對應]。
捲動至 [輸出] 視窗,以尋找輸出檔案的 URL。 按 CTRL 再按一下 URL,以檢視檔案。
您可以檢查輸入和輸出值,以驗證對應是否如預期運作。
範例
下列範例說明如何建立自訂內嵌運算質以供串連兩個字串。 它依賴包含三個字串資源以及一個 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();
}
}
}