Entwickeln benutzerdefinierter Funktoide

BizTalk Server stellt viele Funktoide zur Unterstützung unterschiedlichster Vorgänge bereit. Dennoch kann es vorkommen, dass Sie darüber hinaus andere Funktoide benötigen. Benutzerdefinierte Funktoide stellen Ihnen eine größere Auswahl an Vorgängen innerhalb der BizTalk Server-Zuordnungsumgebung zur Verfügung. Jedes benutzerdefinierte Funktoid wird als .NET-Assembly mithilfe von Klassen bereitgestellt, die von Microsoft.BizTalk.BaseFunctoids abgeleitet werden. Eine Assembly kann mehr als ein benutzerdefiniertes Funktoid enthalten.

Unter folgenden Umständen sollten Sie ein benutzerdefiniertes Funktoid verwenden:

  • Sie verwenden spezielle Validierungs- und Konvertierungsregeln für ein Zeichencodefeld mit Daten, auf die nur über eine proprietäre Legacy-API zugegriffen werden kann.

  • Sie müssen Felder mit benutzerdefinierter Geschäftslogik und Schlüsselverwaltung ver- oder entschlüsseln.

  • Sie müssen aus einem Teil der Nachricht einen Hashcode zur Verwendung in einer anderen Anwendung generieren.

  • Kontoführungsanforderungen, die von Nachrichten an deren Abteilung übertragen wurden, enthalten zusammenfassende Informationen zum Gesamtumsatz nach Produkttyp.

  • Sie möchten eine Zuordnung vereinfachen, indem Sie mehrere verwandte Schritte zusammenfassen, einen anderen Lösungsansatz wählen oder neue Klassenbibliotheken verwenden.

  • Mehrere Zuordnungen verwenden denselben Skriptcode in einem Funktoid zur Skripterstellung.

  • Sie müssen in das Ereignisprotokoll schreiben, wenn bei einem Vorgang ein Fehler auftritt.

    Benutzerdefinierte Funktoide können mithilfe von Inlinecode direkt oder mithilfe eines Verweises auf eine Methode in einer im globalen Assemblycache bereitgestellten Klassenbibliothek indirekt in eine Lösung integriert werden. Beide Integrationstypen basieren auf der BizTalk.BaseFunctoid-Klasse und führen die gleichen allgemeinen Schritte aus:

  1. Erstellen eines neuen Klassenbibliotheksprojekts mithilfe der .NET-Sprache Ihrer Wahl.

  2. Verwenden des Dienstprogramms "sn.exe" für starke Namen zum Erstellen einer Schlüsseldatei und Zuweisen der Schlüsseldatei zum Projekt.

  3. Fügen Sie einen Verweis auf Microsoft.BizTalk.BaseFunctoids.dll hinzu. Diese Assembly enthält die BaseFunctoid-Basisklasse .

  4. Erstellen einer Ressourcendatei und Hinzufügen der Datei zum Projekt. Hinzufügen von Zeichenfolgenressourcen für den Namen, die QuickInfo und die Beschreibung des Funktoids. Hinzufügen einer 16x16-Pixel-Bildressource zum Anzeigen des Funktoids in der Palette des Zuordnungs-Designers.

  5. Implementieren Sie die Funktoidklasse, indem Sie von BaseFunctoid ableiten, grundlegende Parameter im Konstruktor festlegen und dann die Funktoidmethode und alle unterstützenden Methoden schreiben. Die Assembly kann mehrere benutzerdefinierte Funktoide enthalten.

  6. Bereitstellen der Assembly und Sicherstellen, dass das neue Funktoid in der Toolbox-Palette verfügbar ist. Weitere Informationen finden Sie unter Hinzufügen und Entfernen von benutzerdefinierten Funktoiden aus der Visual Studio-Toolbox.

    Im Folgenden finden Sie ein Beispiel für das Funktoid Floor.

/// <summary>  
/// Floor Functoid - finds the floor of input  
/// </summary>  
public class FloorFunctoid : BaseFunctoid  
{  
    public FloorFunctoid()  
        : base()  
    {  
        this.ID = 11001;  
        SetupResourceAssembly("MultipleFunctoids.Resource", Assembly.GetExecutingAssembly());  
  
        SetName("NAME_FLOOR");  
        SetDescription("DESCRIPTION_FLOOR");  
        SetTooltip("DESCRIPTION_FLOOR");  
        SetBitmap("IMAGE_FLOOR");  
  
        SetExternalFunctionName(GetType().Assembly.FullName, " MultipleFunctoids.FloorFunctoid", "MathFloor");  
        this.RequiredGlobalHelperFunctions = InlineGlobalHelperFunction.IsNumeric;  
  
        AddScriptTypeSupport(ScriptType.CSharp);  
        SetMinParams(1);  
        SetMaxParams(1);  
  
        this.Category = FunctoidCategory.Math;  
        this.OutputConnectionType = ConnectionType.AllExceptRecord;  
        AddInputConnectionType(ConnectionType.AllExceptRecord);  
        this.HasSideEffects = false;  
    }  
  
    /// <summary>  
    /// To create the C# function  
    /// </summary>  
    /// <param name="scriptType">Script type</param>  
    /// <param name="numParams">Number of parameters</param>  
    /// <param name="functionNumber">Functoid number</param>  
    /// <returns>C# script</returns>  
    protected override string GetInlineScriptBuffer(ScriptType scriptType, int numParams, int functionNumber)  
    {  
        if (ScriptType.CSharp == scriptType)  
        {  
            StringBuilder builder = new StringBuilder();  
  
            builder.Append("public string MathFloor(string input)\n");  
            builder.Append("{\n");  
            builder.Append("  if(string.IsNullOrEmpty(input))\n");  
            builder.Append("    return string.Empty;\n");  
            builder.Append("double d = 0.0;\n");  
            builder.Append("if (IsNumeric(input, ref d))\n");  
            builder.Append("    return Math.Floor(d).ToString(System.Globalization.CultureInfo.InvariantCulture);\n");  
            builder.Append("else\n");  
            builder.Append("    return string.Empty;\n");  
            builder.Append("}\n");  
  
            return builder.ToString();  
        }  
        else  
        {  
            return string.Empty;  
        }  
    }  
}  
  

Wenn Sie diesen Beispielcode als Teil Ihres C#-Projekts verwenden, muss der Assemblyname auf MultipleFunctoids festgelegt werden. Das C#-Projekt (das diesen Code enthält) sollte eine Datei Resource.resx umfassen.

SetName("NAME_FLOOR");  
SetDescription("DESCRIPTION_FLOOR");  
SetTooltip("DESCRIPTION_FLOOR");  
SetBitmap("IMAGE_FLOOR");  
  

Im oben aufgeführten Code sind die Werte NAME_FLOOR, DESCRIPTION_FLOOR und DESCRIPTION_FLOOR die „Schlüssel“ der Ressourcenzeichenfolgen, die in die Datei Resource.resx eingebettet sind. IMAGE_FLOOR der Name eines in die Datei Resource.resx eingebetteten Bilds. Dieses Bild fungiert als Symbol für das Funktoid.

Wenn Sie keine ordnungsgemäßen Ressourcenschlüssel angeben oder die Methode SetName löschen, wird ein namenloses benutzerdefiniertes Funktoid erstellt. Dies ist keine empfohlene Vorgehensweise. Gleiches gilt für die Methoden SetDescription und SetTooltip. Verwenden Sie diese Methoden immer ordnungsgemäß, um unerwünschtes Verhalten zu vermeiden. Sie können die Methode SetBitmap jedoch auslassen, wenn keine geeigneten Bilder verfügbar sind, die als Funktoidsymbole verwendet werden können. In einem solchen Fall wird ein Standardsymbol vom benutzerdefinierten Funktoid verwendet. Dieser Vorgang ist gefahrlos (es sei denn, es sind mehrere symbollose Funktoide vorhanden).

Weitere Informationen zum Erstellen eines benutzerdefinierten Funktoids finden Sie unter Benutzerdefinierte Funktoid (beispiel für BizTalk Server).

Wichtig

Bestimmte Funktoid-IDs sind durch Standard- oder integrierte Mapper-Funktoide reserviert. Normalerweise verwenden die Standardmäßigen Mapper-Funktoide die IDs von 1 bis 10000. Verwenden Sie beim Erstellen benutzerdefinierter Funktoide nicht die Funktoid-IDs, die kleiner als 10000 sind.

In diesem Abschnitt

Dieser Abschnitt enthält die folgenden Themen:

Weitere Informationen

Verwenden von Funktoiden zum Erstellen komplexerer Zuordnungen