Erweiterte Programmierung


Sie können Methoden in iPlus auf zwei Arten deklarieren:

  • entweder im Quellcode in Ihrer Assembly
  • oder als Scriptmethode in der iPlus-Entwicklungsumgebung.

Um Methoden im iPlus-Framework bekanntzugeben, müssen Sie die Attributklasse ACMethodInfo oder eine der Ableitungen verwenden und vor der Methodensignatur einfügen. Diese Assembly Methoden sollten möglichst public sein.

Je nach Einsatzzweck stehen Ihnen verschiedenen Signaturen in Ableitungen der ACMethodInfo-Attributklasse zur Verfügung.

Folgende Einsatzzwecke sind vorgesehen:

  • Serverseitige bzw. lokale Verwendung
  • Kommandomethode
  • Nur clientseitige Verwendung
  • Methode für Kontextmenüs 
  • Angefügte Methode (Erweiterungsmethode)
  • Statusabhängige Methode
 

Verwenden Sie die Attributklasse ACMethodInfo für klassische Methoden die:

  • Parameter und / oder Rückgabewerte besitzen können
  • und lokal oder über das Netzwerk aufgerufen werden können.
[ACMethodInfo("ExGroup", "en{'Example serverside'}de{'Beispiel serverseitig'}", 202, false)]
public Boolean MyServersideMethod(string stringParam)
{... return false}

Erfolgt der Methodenaufruf auf einer Proxy-Komponente (clientseitig) per ACUrlCommand delegiert das Framework den Aufruf im Hintergrund über das Netzwerk an die serverseitige Instanz. Die Methode wird dann serverseitig (auf der reelen Instanz) ausgeführt und der Rückgabewert wieder per Netzwerk zurückgesendet. Während dieser Zeit ist der Thread, der clientseitig die Methode aufgerufen hat, blockiert (synchroner Aufruf).

Beachten Sie, dass sowohl die Typen der Parameterliste als auch der Rückgabewert serialisierbar und dem DataContractSerializer bekannt sein müssen, wenn Sie Remote-Aufrufe ausführen wollen. Wird die Methode nur in der lokalen Anwendungsdomäne aufgerufen müssen die Typen nicht serialisierbar sein.


Die Attributklasse-ACMethodCommand verwenden Sie für parameterlose void-Methoden überwiegend im Zusammenhang mit Buttons an der Oberfläche.

[ACMethodCommand("ExGroup", "en{'Example command'}de{'Beispiel Kommando'}", 202, false)]
public void MyCommand() }

Kommando-Methoden haben eine Besonderheit gegenüber der klassischen Verwendung der ACMethodInfo: Vor den Aufruf der Kommando Methode prüft die IsEnabled-Methode zuerst ob der Aufruf der Kommando-Methode erlaubt ist. Deklarieren Sie hierfür eine weitere Methode mit dem Präfix "IsEnabled" gefolgt von dem Methodennamen der Kommandomethode:

public bool IsEnabledMyCommand() { return true/false; }

Hinweis: Die Methode muss einen boolschen Rückgabewert haben.

Der CanExecute-Eventhandler des CommandBindings von UIElementen ruft die IsEnabled-Methode auf. Dieser CanExecute-Eventhandler in iPlus-Steuerelementen (z.B. Buttons, MenuItems, Ribbon) automatisch gesetzt. Somit müssen Sie bei der GUI-Programmierung nichts weiter unternehmen als den Methodennamen der Kommandomethode in der VBContent-Eigenschaft einzugeben. Der komplexe CanExecute-Eventhandling des WPF-Frameworks bleibt für Sie verborgen.

#IsEnabled

Remote-Aufrufe (Delegierung von Methodenaufrufen über das Netzwerk) belasten zum einen die Netzwerkschicht und verursachen ggf. Rechenleistung auf Serverseite. Methoden, die keine Änderung des Objektzustands (Änderung der Eigenschaftswerte einer Instanz) zur Folge haben müssen daher nicht zwangsläufig serverseitig ausgeführt werden. Hier kommen sogenannte Client-seitige Methoden zum Einsatz

Verwenden Sie die Attributklasse ACMethodClient immer dann wenn:

  • alle Daten (Objektzustand) in der Proxy-Komponente vorliegen die für den Methodenalgorithmus benötigt werden,
  • wenn die Methode oft aufgerufen wird und nur clientseitige Relevanz hat (z.B. für die GUI: Berechnung einer Signalfarbe, Umrechnung von Einheiten...)
  • Datenbankoperationen clientseitig gemacht werden können bzw. sollen.

Clientseitige Methoden mit der Attributklasse ACMethodClient können nur statisch sein. Ähnlich dem Konzept der .NET-Erweiterungsmethoden, muss dem Algorithmus  der statischen Methode der "this-Pointer" bekannt sein. Deswegen muss die Signatur der Methode immer so aufgebaut sein, dass der erste Parameter immer eine IACComponent acComponent ist:

[ACMethodClient ("ExGroup", "en{'Example clientside'}de{'Beispiel clientseitig'}", 202, false)]
public static Boolean MyClientsideMethod(IACComponent acComponent, string stringParam)
{... return false; }

Beim Aufruf von clientseitigen Methoden per ACUrlCommand wird der erste Parameter (this-Pointer) automatisch vom iPlus-Framework gesetzt und darf daher nicht explizit übergeben werden!

Parameter müssen bei clientseitigen Methoden nicht serialisierbar sein.

Die IsEnabled-Methode muss dem zufolge auch statisch sein und benötigt den Parameter IACComponent acComponent:

public static bool IsEnabledMyClientsideMethod(IACComponent acComponent) 
{... return true;  }

Verwenden Sie die Attributklasse ACMethodInteraction um parameterlose void-Methoden über das Kontextmenü aufzurufen. ACMethodInteraction ist eine Ableitung der ACMethodCommand-Klasse.

[ACMethodInteraction("ExGroup", "en{'Example contextmenu command'}de{'Beispiel Kontextmenü-Kommando'}", 200, true, "", Global.ACKinds.MSMethod, false, Global.ContextMenuCategory.ProcessCommands)]
public virtual void MyCtxMenuMethod()

Wie auch bei der ACMethodCommand-Attributklasse können Sie eine IsEnabled-Methode defininieren. Das iPlus-Framework ruft die IsEnabled Methode auf sobald das Kontextmenü an der Oberfläche angezeigt werden soll. Gibt die Methode "false" zurück wird kein Kontextmenüeintrag für diese Methode angezeigt.

Mit dem letzten Parameter contextMenuCategory legen Sie fest in welchen Untermenü (Kategorie) Ihre Methode angezeigt werden soll.

Die zur Auswahl stehenden Kategorien sind mit der Enumeration ContextMenuCategory im Framework bereits vordefiniert und können nicht individuell definiert werden.

Verwenden Sie für clientseitge Methoden die Attributklasse ACMethodInteractionClient.


Verwenden Sie die Attributklasse ACMethodAttached zum Anzeigen von Methoden im Kontextmenü.

Methoden, die mit dieser Attributklasse gekennzeichnet sind, werden nicht im Kontextmenü der eigenen Klasse A angezeigt, sondern im Kontextmenü einer anderen Klasse B, an der die Methode "angehängt" wurde.

[ACMethodAttached ("ExGroup", "en{'Example attached'}de{'Beispiel angehängt'}", 202, typeof(PAClassAlarmingBase), false)]
public static void MyAttachedMethod(IACComponent acComponent) { }

Im vierten Parameter des Konstruktors geben Sie den Typ der Klasse B an der die Methode anhängt werden soll (z.B. typeof(ClassnameB) ). 

Angefügte funktionieren wie Client-Seitige Methoden oder .NET-Erweiterungsmethoden. Deswegen muss

  • die Signatur Ihrer Attached-Methode statisch
  • und der erste und einzige Parameter vom Typ IACComponent

sein.

 

Die IsEnabled-Methode muss statisch sein und benötigt den Parameter IACComponent acComponent:

public static bool IsEnabledMyAttachedMethod(IACComponent acComponent)
{ return true;  }

Das iPlus-Framework übergibt Ihnen hier eine Instanz der Klasse an die Ihre Methode angehängt wird als this-Pointer.


Verwenden Sie die Attributklasse ACMethodState um Methoden zu beschreiben deren Aufruf bei einer Änderung des Zustandes einer ACComponent erfolgt.

Mit Zustand ist der Wert einer Eigenschaft gemeint, die speziell dazu verwendet wird um einen Zustand zu beschreiben. Komponenten, die eine Ableitung von PABase sind (Prozessfunktionen oder Workflowklassen), nutzen die Eigenschaft ACState zur Beschreibung des aktuellen Zustands.

Der Typ der ACState-Eigenschaft ist die Enumeration ACStateEnum. Die Methoden in diesen Klassen werden genau so genannt wie die möglichen Werte des ACStateEnum. Ändert sich nun der Wert der ACState-Eigenschaft wird die entsprechende Methode mit dem selben Namen aufgerufen.

[ACMethodState("en{'Idle'}de{'Leerlauf'}", 10, true)]
public virtual void SMIdle() { }

Diese automatisierten Aufrufe der Statusmethoden sind speziell in der Klasse PABase programmiert.

Wenn Sie Ihre eigene Status-Eigenschaft + Statusmethoden nutzen möchten, implementieren Sie diese anhand des folgenden Beispielcodes:

 


Im vorigen Codebeispiel ACMethodState wurde die ExecuteACMethod Methode verwendet, um eine Methode über einen Namen aufzurufen. Intern wird dazu Reflection verwendet, um die Methode aufzurufen. Da Reflection ein aufwändiger .NET-Prozess ist, kann dies umgangen werden, indem man die entsprechende Methode selbst aufruft wenn die "ExecuteACMethod"-Methode ausgeführt wird.

Die Klasse ACComponent stellt dazu die virtuelle Methode HandleExecuteACMethod zur Verfügung. Überschreiben Sie die Methode in ihrer Klasse wie folgt:

 

Wenn die überschriebene Methode "true" zurückgibt, teilt sie dem Framework mit, dass die abgeleitete Klasse selbst die Methode aufgerufen hat und das Framework keinen Reflection-Aufruf mehr machen muss.

Besitzt die Methode einen Rückgabewert müssen Sie die out-Variable "result" mit diesem Wert setzen. Parameterwerte stehen in der Variable acParameter und werden per indiziertem Array-Zugriff gelesen.

Das zuvor beschriebene Verfahren funktioniert nur mit instanzbezogenen Methoden.
Statische Methoden hingegen müssen mittels statischen Handlern aufgerufen werden:

 

Statische Methoden können Sie nicht überschreiben. Somit kann die ACComponent auch keine virtuelle Methode bereitstellen, die ihr im Vorfeld schon bekannt ist. Um diese statischen Handler-Methoden dem iPlus-Framework bekannt zu geben, müssen Sie im statischen Klassenkonstruktor die Methode RegisterExecuteHandler" aufrufen und Ihre Handler-Methode als Delegat übergeben:

static MyClass()
{
RegisterExecuteHandler(typeof(MyClass), HandleExecuteACMethod_MyClass);
}

 


Im vorigen Code-Beispiel "HandleExecuteACMethod_MyClass" wird die "AskUserExampleAskMethod"-Methode aufgerufen. Methoden mit dem Präfix "AskUser" werden wie "IsEnabled"-Methoden vom Framework automatisiert aufgerufen. Sie dienen dazu dem Programmierer die Möglichkeit zu geben vor dem Aufruf der eigentlichen Methode noch eingreifen zu können, um z.B. den Benutzer noch etwas abzufragen.

Angefügte funktionieren wie Client-Seitige Methoden oder .NET-Erweiterungsmethoden. Deswegen muss

  • die Signatur Ihrer Attached-Methode statisch
  • und der erste und einzige Parameter vom Typ IACComponent

sein:

 

Eine "ACMethodInfo"-Attributklasse muss nicht verwendet werden. Lediglich muss die Zeichenfolge nach dem "AskUser"-Präfix mit dem Namen der Methode übereinstimmen, die am Schluss aufgerufen werden soll.


Alle diese zuvor beschriebenen Methoden können auch als Skriptmethode definiert werden. Skriptmethoden werden in der Datenbank gespeichert. Während der Laufzeit werden sie als statische Methoden kompiliert und der ACComponent-Instanz angehängt. Da statische Methoden nicht wissen zu welcher Klasse sie angehören, benötigen sie wie Erweiterungsmethoden auch, eine Referenz zu der Instanz auf der sie die Operationen durchführen sollen. Aus diesem Grund muss die Signatur einer Skriptmethode immer so sein, dass der erste Parameter IACComponent ist (siehe oben "angefügte Methoden" oder "clientseitige Methode"):

 

Nach IACComponent, kommen dann die restlichen individuellen Parameter. 

Bitte denken Sie daran, dass Sie denselben Methodennamen aus dem Skriptcode in das Feld Methodenname (ACIdentifier) in der Registerkarte "Methodeninfo" übertragen.

Der Abschnitt "<Precompiler>" ist eine spezielle Direktive für das iPlus-System. Hier tragen Sie Ihre using-Anweisungen ein. Falls Sie eine Assembly benötigen, die nicht automatisch zur Laufzeit in die Anwendungsdomäne der iPlus-Anwendung geladen wurde, müssen Sie diese explizit mit dem Schlüsselwort "refassembly" angeben, damit Sie von der iPlus-Runtime geladen wird.