Freigeben über


Entwickeln von benutzerdefinierten Funktoiden

Obwohl BizTalk Server viele Functoids bereitstellt, um eine Reihe verschiedener Vorgänge zu unterstützen, werden Sie wahrscheinlich auf eine Situation stoßen, die einen anderen Ansatz erfordert. Benutzerdefinierte Functoids bieten eine Möglichkeit, um den Bereich der Vorgänge zu erweitern, die in der BizTalk Server-Zuordnungsumgebung verfügbar sind. Jedes benutzerdefinierte Functoid wird als .NET-Assembly mithilfe von Klassen bereitgestellt, die von Microsoft.BizTalk.BaseFunctoids abgeleitet sind. Eine Assembly kann mehrere benutzerdefinierte Functoid enthalten.

Sie sollten die Verwendung eines benutzerdefinierten Functoids in den folgenden Szenarien in Betracht ziehen:

  • Sie verfügen über spezielle Gültigkeitsprüfungs- und Konvertierungsregeln für ein Zeichencodefeld mithilfe von Daten, auf die nur über eine proprietäre Legacy-API zugegriffen werden kann.

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

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

  • Die Buchhaltung verlangt, dass die an ihre Abteilung übermittelten Nachrichten zusammenfassende Informationen über den Gesamtumsatz nach jedem Produkttyp enthalten.

  • Sie möchten die Komplexität einer Karte reduzieren, indem Sie mehrere verwandte Schritte kombinieren, indem Sie einen anderen Ansatz oder neue Klassenbibliotheken verwenden.

  • Mehrere Zuordnungen verwenden denselben Skriptcode in einem Skript-Functoid.

  • Sie müssen in das Ereignisprotokoll schreiben, wenn ein Vorgang fehlschlägt.

    Benutzerdefinierte Functoids können direkt mithilfe von Inlinecode oder indirekt mithilfe eines Verweises auf eine Methode in einer Klassenbibliothek, die im globalen Assemblycache bereitgestellt wird, in eine Lösung integriert werden. Beide Integrationstypen basieren auf der BizTalk.BaseFunctoid-Klasse und folgen den gleichen allgemeinen Schritten:

  1. Erstellen Sie ein neues Klassenbibliotheksprojekt mit der .NET-Sprache Ihrer Wahl.

  2. Erstellen Sie mithilfe des Hilfsprogramms für starke Benennungen sn.exeeine Schlüsseldatei, und weisen Sie sie dem Projekt zu.

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

  4. Erstellen Sie eine Ressourcendatei, und fügen Sie sie dem Projekt hinzu. Fügen Sie Ressourcen für Zeichenfolgen für den Functoid-Namen, die QuickInfo und die Beschreibung hinzu. Fügen Sie eine 16 x 16-Pixel-Bildressource hinzu, um das Functoid in der Karten-Designer-Palette darzustellen.

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

  6. Stellen Sie die Assembly bereit und stellen Sie sicher, dass das neue Functoid über die Toolbox-Palette verfügbar ist. Siehe Hinzufügen und Entfernen von benutzerdefinierten Functoiden aus der Visual Studio-Toolbox.

    Im Folgenden sehen Sie eine Illustration für Floor-Functoid.

/// <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;  
        }  
    }  
}  
  

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

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

Im obigen Code sind die Werte "NAME_FLOOR", "DESCRIPTION_FLOOR" und "DESCRIPTION_FLOOR" die "Schlüssel" von Ressourcenzeichenfolgen, die in der Datei "Resource.resx" eingebettet sind. Und "IMAGE_FLOOR" ist der Name eines Bilds, das in die Datei "Resource.resx" eingebettet ist. Dieses Bild fungiert als Symbol für das Funktoid.

Wenn Sie keine richtigen Ressourcenschlüssel angeben oder die SetName-Methode löschen, wird ein nameloses benutzerdefiniertes Functoid erstellt, was keine bewährte Methode ist. Gleiches gilt für SetDescription- und SetTooltip-Methoden. Verwenden Sie diese Methoden immer richtig, um unerwünschte Garbage Behavior zu vermeiden. Sie können die SetBitmap-Methode jedoch überspringen, wenn Sie keine geeigneten Bilder haben, die als Functoidsymbole verwendet werden sollen. In einem solchen Fall wird ein Standardsymbol von dem benutzerdefinierten Funktoid verwendet, das harmlos ist (es sei denn, es gibt mehrere symbollose Funktoiden).

Weitere Informationen dazu, wie Sie ein benutzerdefiniertes Functoid erstellen, lesen Sie im Custom Functoid (BizTalk Server Sample).

Von Bedeutung

Bestimmte Functoid-IDs sind von den standardmäßigen bzw. integrierten Mapper-Functoids reserviert. In der Regel verwenden die Standardmäßigen Mapper-Funktoiden die IDs von 1 bis 10000. Verwenden Sie keine Functoid-IDs unter 10000, wenn Sie benutzerdefinierte Funktoide erstellen.

In diesem Abschnitt

Dieser Abschnitt enthält:

Siehe auch

Functoiden zur Erstellung komplexerer Zuordnungen verwenden