Freigeben über


Entwickeln eines benutzerdefinierten kumulativen Functoids

Verwenden Sie ein benutzerdefiniertes kumulatives Functoid, um Akkumulationsvorgänge für Werte auszuführen, die in einer Nachricht mehrfach auftreten.

Sie müssen beim Entwickeln eines kumulativen Functoids drei Funktionen implementieren. Die drei Funktionen entsprechen dem Initialisieren, Kumulieren und Abrufen von Aktionen, die die Karte zum Ausführen der Akkumulation benötigt. Bevor wir auf diese Funktionen eingehen, ist es wichtig, über die Threadsicherheit zu sprechen.

Schreiben eines Thread-Safe-Funktoids

Der Functoidcode muss threadsicher sein, da unter Stressbedingungen mehrere Instanzen einer Karte gleichzeitig ausgeführt werden können. Zu den zu beachtenden Punkten gehören:

  • Statischer Zustand muss threadsicher sein.

  • Der Instanzstatus muss nicht immer threadsicher sein.

  • Berücksichtigen Sie bei der Gestaltung die Funktionsfähigkeit unter Hochstressbedingungen. Vermeiden Sie es nach Möglichkeit, Verriegelungen zu übernehmen.

  • Vermeiden Sie nach Möglichkeit die Notwendigkeit der Synchronisierung.

    BizTalk Server bietet einen einfachen Mechanismus, um die Komplexität des Schreibens eines threadsicheren kumulativen Funktoids zu reduzieren. Alle drei Funktionen haben denselben ersten Parameter, einen ganzzahligen Indexwert. BizTalk Server weist dem Indexwert eine eindeutige Nummer zu, wenn die Initialisierungsfunktion aufgerufen wird. Sie können diesen Wert als Index in einem Array verwenden, das Werte akkumuliert, wie im folgenden Code gezeigt:

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. Dies liegt daran, dass die Initialisierungsfunktion möglicherweise nicht mit Indexwerten in der Reihenfolge aufgerufen wird.

Implementieren der drei kumulativen Funktionen

Sie müssen drei Funktionen für jeden kundenspezifischen kumulativen Funktor umsetzen, den Sie entwickeln. Die Funktionen und die Methoden, die Sie im Konstruktor aufrufen müssen, um sie festzulegen, werden in der folgenden Tabelle zusammengefasst. Alle Funktionen geben Zeichenfolgenwerte zurück.

Hinweis

Sie bestimmen den besten Namen für jede Funktion, aber jede Funktion muss die Anzahl und den Typ von Argumenten angegeben haben.

Funktionszweck Argumente So legen Sie eine Referenz fest So legen Sie ein Inlineskript fest
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

Mit der Initialisierung können Sie die Mechanismen vorbereiten, die Sie zum Durchführen der Akkumulation verwenden. Sie können ein Array initialisieren, einen oder mehrere Werte zurücksetzen oder andere Ressourcen nach Bedarf laden. Der Rückgabewert der Zeichenfolge wird nicht verwendet.

Kumulierung

Hier führen Sie den Akkumulationsvorgang aus, der für Ihr Funktoid geeignet ist. BizTalk Server übergibt die folgenden drei Parameter:

  • Inhaltsverzeichnis. Ein ganzzahliger Wert, der eine Karteninstanz darstellt. Es können mehrere Karteninstanzen gleichzeitig ausgeführt werden.

  • Val. Eine Zeichenfolge, die den Wert enthält, der gesammelt werden soll. Es sei denn, Sie schreiben ein String Cumulate Functoid, handelt es sich um einen numerischen Wert.

  • Bereich. Eine Zeichenfolge mit einer Zahl, die angibt, welches Element oder welches Attributwert angesammelt werden soll. Tatsächliche Werte werden durch eine Implementierung bestimmt.

    Sie entscheiden, welche Werte gesammelt werden sollen und welche Werte 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 ( IsDate und IsNumeric ) bereit, um die Validierung zu unterstützen.

Hinweis

Wenn Sie IsDate oder IsNumeric in einem Inlineskript verwenden, müssen Sie "RequiredGlobalHelperFunctions" so festlegen, dass die Funktionen für Ihr Skript verfügbar gemacht werden.

Der Zeichenfolgen-Rückgabewert wird nicht verwendet.

Herunterladen

Wenn BizTalk Server das Durchlaufen aller Werte abgeschlossen hat, die durch die Functoideinstellungen in der Abbildung bestimmt werden, fordert er den kumulierten Wert an. Die Get-Funktion hat ein Argument, Index, das ein ganzzahliger Wert ist und eine Map-Instanz darstellt. Die Funktion sollte den Indexwert verwenden, um den angesammelten Wert als Zeichenfolge zu suchen und zurückzugeben.

Beispiel

Das folgende Beispiel zeigt, wie man eine benutzerdefinierte Funktion für die kumulative Multiplikation erstellt. Sie basiert auf einer Ressourcendatei, die drei Zeichenfolgenressourcen und eine Bitmapressource mit 16 x 16 Pixeln enthält.

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();  
        }  
    }  

Siehe auch

Verwenden von BaseFunctoid
Entwickeln eines benutzerdefinierten Inline-Functoids
Benutzerdefiniertes Functoid (BizTalk Server-Beispiel)