Dieses Dokument beschreibt eine erste Beispielimplementierung eines Plugins im DataMigratePro-System.
1. Einführung
Mit der Plugin-Architektur von DataMigratePro lassen sich externe Funktionen modular in das System einbinden. Ziel ist die Erweiterbarkeit, ohne den Kerncode anzupassen.
2. Entwicklung des Plugins
Das folgende Beispiel implementiert die Schnittstelle IRelayPlugin. Die Aktion getprinter liefert eine Liste der lokal installierten Drucker zurück:
using System;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Drawing.Printing;
using DataMigratePro.Plugins;
namespace GetPrinterPlugin
{
public class GetPrinterPlugin : IRelayPlugin
{
public string ActionName => "getprinter";
public async Task<string> ExecuteAsync(string base64Data)
{
await Task.Yield(); // simulate async
string decodedInput = Encoding.UTF8.GetString(Convert.FromBase64String(base64Data));
var printers = new List<string>();
foreach (string printer in PrinterSettings.InstalledPrinters)
{
printers.Add(printer);
}
var result = new
{
action = ActionName,
input = decodedInput,
printers = printers
};
return System.Text.Json.JsonSerializer.Serialize(result, new System.Text.Json.JsonSerializerOptions { WriteIndented = true });
}
}
}🔧 Hinweis: Die Plugin-DLL sowie die DataMigratePro.Plugins.dll müssen ins Unterverzeichnis plugins kopiert werden.
3. Business Central Integration
Für die Ansteuerung des Plugins wird eine AL-Page bereitgestellt, die den Aufruf übernimmt und das Ergebnis darstellt.
page 50100 "Relay Result Viewer"
{
PageType = Card;
Caption = 'Relay Result Viewer';
ApplicationArea = All;
UsageCategory = Administration;
layout
{
area(content)
{
field("ActionText"; ActionText) { ApplicationArea = All; }
field("JSON (Raw)"; RawJsonText) { ApplicationArea = All; MultiLine = true; }
field("Response"; ResultText) { ApplicationArea = All; Editable = false; MultiLine = true; }
field("Info"; InfoText) { ApplicationArea = All; Editable = false; Style = Attention; StyleExpr = true; }
}
}
actions
{
area(Processing)
{
group(Action)
{
action(SendToRelay)
{
Caption = 'Send to Azure Relay';
Image = ExecuteBatch;
ApplicationArea = All;
Promoted = true;
PromotedCategory = Process;
PromotedIsBig = true;
trigger OnAction()
var
Sender: Codeunit "Azure Relay Sender IOI";
FullJson: Text;
EncodedMessage: Text;
begin
Base64Data := ToBase64(RawJsonText);
FullJson := '{"action":"' + ActionText + '","data":"' + Base64Data + '"}';
EncodedMessage := ToBase64(FullJson);
ResultText := Sender.SendMessage(EncodedMessage);
end;
}
}
}
}
trigger OnOpenPage()
begin
ActionText := 'getprinter';
RawJsonText := '{}';
InfoText :=
'This tool sends actions to Azure Relay. ' +
'The data will be base64 encoded and wrapped into a JSON structure like: ' +
'{"action":"...","data":"..."}, then encoded again before sending.';
end;
var
ActionText: Text;
RawJsonText: Text;
Base64Data: Text;
ResultText: Text;
InfoText: Text;
local procedure ToBase64(InputText: Text): Text
var
TempBlob: Codeunit "Temp Blob";
Base64Convert: Codeunit "Base64 Convert";
OutStr: OutStream;
InStr: InStream;
begin
TempBlob.CreateOutStream(OutStr, TextEncoding::UTF8);
OutStr.WriteText(InputText);
TempBlob.CreateInStream(InStr, TextEncoding::UTF8);
exit(Base64Convert.ToBase64(InStr));
end;
}4. Beispielausgabe
Das Ergebnis wird nach erfolgreicher Ausführung im Response-Feld der Page angezeigt:

5. Fazit
Dieses Plugin zeigt, wie flexibel und modular DataMigratePro erweitert werden kann. Durch diese Architektur lassen sich neue Funktionen in isolierten Modulen entwickeln, testen und betreiben.