Entwickeln eines benutzerdefinierten kumulativen Funktoids
Mit einem benutzerdefinierten kumulativen Funktoid werden Werte kumuliert, die mehrfach in einer Instanznachricht enthalten sind.
Beim Entwickeln eines kumulativen Funktoids müssen Sie drei Funktionen implementieren. Die drei Funktionen entsprechen den Aktionen "Initialisieren", "Kumulieren" und "Abrufen", die die Zuordnung zum Durchführen der Kumulation benötigt. Zunächst ist es jedoch wichtig, kurz auf die Threadsicherheit einzugehen.
Schreiben eines threadsicheren Funktoids
Der Funktoidcode muss threadsicher sein, da in Situationen mit hoher Last möglicherweise mehrere Instanzen einer Zuordnung gleichzeitig ausgeführt werden. Folgendes ist zu beachten:
Der statische Status muss threadsicher sein.
Der Instanzstatus muss nicht immer threadsicher sein.
Beim Entwurf sollten Situationen mit hoher Last berücksichtigt werden. Vermeiden Sie Sperren, wo immer Sie können.
Vermeiden Sie nach Möglichkeit die Notwendigkeit einer Synchronisierung.
BizTalk Server vereinfacht mithilfe eines einfachen Mechanismus das Schreiben eines threadsicheren kumulativen Funktoids. Alle drei Funktionen besitzen denselben ersten Parameter, einen ganzzahligen Indexwert. BizTalk Server weist dem Indexwert eine eindeutige Zahl zu, wenn Ihre Initialisierungsfunktion aufgerufen wird. Sie können diesen Wert als Index in einem Array verwenden, das kumulierende Werte aufnimmt, wie im Folgenden dargestellt:
private HashTable cumulativeArray = new HashTable();
…
// Initialization function
public string InitCumulativeMultiply(int index)
{
cumulativeArray[index] = 1.0;
return string.Empty;
}
In diesem Beispiel wird anstelle einer "ArrayList" eine "HashTable" verwendet, da die Initialisierungsfunktion möglicherweise nicht mit geordneten Indexwerten aufgerufen wird.
Implementieren der drei kumulativen Funktionen
Sie müssen für jedes benutzerdefinierte kumulative Funktoid, das Sie entwickeln, drei Funktionen implementieren. Die Funktionen und Methoden, die Sie zum Festlegen im Konstruktor aufrufen müssen, werden in der folgenden Tabelle zusammengefasst. Alle Funktionen geben Zeichenfolgenwerte zurück.
Hinweis
Sie legen für jede Funktion einen Namen fest. Für jede Funktion müssen Anzahl und Typ der Argumente angegeben werden.
Zweck der Funktion | Argumente | Zum Festlegen eines Verweises | Zum Festlegen eines Inlineskripts |
---|---|---|---|
Initialisierung | int index | SetExternalFunctionName | SetScriptBuffer mit functionNumber = 0 |
Kumulation | int index, string val, string scope | SetExternalFunctionName2 | SetScriptBuffer mit functionNumber = 1 |
Herunterladen | int index | SetExternalFunctionName3 | SetScriptBuffer mit functionNumber = 2 |
Initialisierung
Bei der Initialisierung können Sie die Mechanismen vorbereiten, die Sie zum Durchführen der Kumulation verwenden möchten. Sie können ein Array initialisieren, einen oder mehrere Werte zurücksetzen oder bei Bedarf andere Ressourcen laden. Der Rückgabewert der Zeichenfolge wird nicht verwendet.
Kumulation
Hier führen Sie die geeignete Kumulation für das Funktoid durch. BizTalk Server übergibt die folgenden drei Parameter:
Index. Ein Integer-Wert, der einer Zuordnungsinstanz entspricht. Möglicherweise werden mehrere Zuordnungsinstanzen gleichzeitig ausgeführt.
Val. Eine Zeichenfolge mit dem Wert, der kumuliert werden soll. Sofern Sie nicht eine Zeichenfolge für ein kumulatives Funktoid schreiben, handelt es sich um einen numerischen Wert.
Umfang. . Eine Zeichenfolge mit dem Wert, der angibt, welcher Elemente- oder Attributwert kumuliert werden soll. Tatsächliche Werte werden durch eine Implementierung ermittelt.
Sie entscheiden, welche Werte kumuliert und welche ignoriert werden sollen. Sie können beispielsweise Werte ignorieren, die nicht unter 0 liegen, aber eine Ausnahme auslösen, wenn ein Wert nicht numerisch ist. BaseFunctoid stellt zwei Funktionen bereit: IsDate und IsNumeric, um die Validierung zu unterstützen.
Hinweis
Wenn Sie IsDate oder IsNumeric in einem Inlineskript verwenden, stellen Sie sicher, dass Sie RequiredGlobalHelperFunctions festlegen, damit die Funktionen für Ihr Skript verfügbar gemacht werden.
Der Rückgabewert der Zeichenfolge wird nicht verwendet.
Herunterladen
Wenn BizTalk Server die Iteration durch alle Werte abgeschlossen hat, die von den Funktoideinstellungen in der Zuordnung festgelegt wurden, wird der kumulierte Wert angefordert. Die Get-Funktion verfügt über ein Argument, Index
, bei dem es sich um einen ganzzahligen Wert handelt, der eine Zuordnung instance darstellt. Ihre Funktion sollte den Indexwert zum Suchen und Ausgeben des kumulierten Werts als Zeichenfolge verwenden.
Beispiel
Im folgenden Beispiel wird gezeigt, wie ein benutzerdefiniertes Funktoid erstellt wird, das eine kumulative Multiplikation durchführt. Es beruht auf einer Ressourcendatei mit drei Zeichenfolgenressourcen und einer 16x16-Pixel-Bitmapressource.
using System;
using Microsoft.BizTalk.BaseFunctoids;
using System.Reflection;
using System.Text;
using System.Collections;
using System.Globalization;
namespace Microsoft.Samples.BizTalk.CustomFunctoid
{
public class CumulativeMultiplyFunctoid : BaseFunctoid
{
private ArrayList myCumulativeArray = new ArrayList();
public CumulativeMultiplyFunctoid() : base()
{
//ID for this functoid
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_CUMULATIVEMULTIPLYFUNCTOID_NAME");
SetTooltip("IDS_CUMULATIVEMULTIPLYFUNCTOID_TOOLTIP");
SetDescription("IDS_CUMULATIVEMULTIPLYFUNCTOID_DESCRIPTION");
SetBitmap("IDB_CUMULATIVEMULTIPLYFUNCTOID_BITMAP");
// Put this string handling function under the Cumulative
// Functoid tab in the Visual Studio toolbox for functoids
Category = FunctoidCategory.Cumulative;
// 2 required parameters, no optional parameters
SetMinParams(1);
SetMaxParams(2);
// Functoid accepts three inputs
AddInputConnectionType(ConnectionType.AllExceptRecord);
AddInputConnectionType((~ConnectionType.FunctoidCount) & (~ConnectionType.FunctoidIndex) & (~ConnectionType.FunctoidIteration) & (~ConnectionType.FunctoidCumulative) & (~ConnectionType.FunctoidLooping) & (~ConnectionType.Record));
AddInputConnectionType(ConnectionType.AllExceptRecord);
// Set the output connection type
OutputConnectionType = ConnectionType.AllExceptRecord;
// Set the Initialize, Cumulative and Get functions
SetExternalFunctionName(GetType().Assembly.FullName, "Microsoft.Samples.BizTalk.CustomFunctoid.CumulativeMultiplyFunctoid", "InitCumulativeMultiply");
SetExternalFunctionName2("AddToCumulativeMultiply");
SetExternalFunctionName3("GetCumulativeMultiply");
}
// Initialization function
public string InitCumulativeMultiply(int index)
{
if (index >= 0)
{
if (index >= myCumulativeArray.Count)
{
myCumulativeArray.Add(1.0);
}
else
{
myCumulativeArray[index] = 1.0;
}
}
return "";
}
// Cumulative function
public string AddToCumulativeMultiply(int index, string val, string reserved)
{
if (index < 0 || index >= myCumulativeArray.Count)
{
return "";
}
if (IsNumeric(val))
{
double dval = Convert.ToDouble(val, CultureInfo.InvariantCulture);
myCumulativeArray[index] = (double)(myCumulativeArray[index]) * dval;
}
return myCumulativeArray[index].ToString();
}
// Get Function
public string GetCumulativeMultiply(int index)
{
if (index < 0 || index >= myCumulativeArray.Count)
{
return "";
}
return myCumulativeArray[index].ToString();
}
}
Weitere Informationen
Verwenden der Klasse „BaseFunctoid“
Entwickeln eines benutzerdefinierten Inlinefunktoids
Benutzerdefiniertes Funktoid (BizTalk Server-Beispiel)