Teilen über


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)