Erweiterte Programmierung


In .NET kennen Sie das Prinzip der Event-Programmierung und der Deklaration von Ereignisse mit dem event-Schlüsselwort. Leider funktioniert dies nur innerhalb derselben Anwendungsdomäne und nicht netzwerkweit. Für eine netzwerktransparente Event-Programmierung stellt das iPlus-Framework das Konzept der "Ereignis-Punkte" zur Verfügung:

 

 

Im Kapitel Client-/Service-Punkte wurde das Prinzip von Verbraucher und Service im Zusammenhang mit Punkten erklärt.

Ereignisse basieren auf dem selben Entwurfsmuster und sind lediglich eine erweiterte Implementierung (blau gestrichelter Rahmen):

 

IACPointEvent<T> erbt von zwei Schnittstellen:

  1. IACPointNet<T, W> - Ein Netzwerkfähiger IACPoint<W> der in der Lage ist seine ConnectionList-Eigenschaft über der das Netzwerk übertragen zu können.
  2. IACPointNetService<T, W>, das einen "Service-Punkt" darstellt. Ein Service-Punkt stellt im abstrakten Sinne einen Dienst für seine ConnectionList-Einträge bereit. Diese Schnittstelle ist auch die Basis zur Bereitstellung von Asynchronen Methoden.

Die Klasse ACPointEvent implementiert IACPointEvent<T>. Mit ACPointEvent -Instanzen können Komponenten Ereignisse bereitstellen, die netzwerkweit abonniert werden können. Die Ereignis-Abonnements werden in die ConnectionList eingetragen. Konsumenten (Komponenten aus der selben oder einer entfernten Anwendungsdomäne) können die ConnectionList nicht direkt befüllen sondern benötigen die Schnittstelle IACPointEventSubscr:

IACPointEventSubscr<T> erbt von zwei Schnittstellen:

  1. IACPointNet<T, W> - Ein Netzwerkfähiger IACPoint<W> der in der Lage ist seine ConnectionList-Eigenschaft über der das Netzwerk übertragen zu können.
  2. IACPointNetClient, das einen "Client-Punkt" darstellt. Ein Client-Punkt stellt im abstrakten Sinne einen Konsumenten dar, der Dienstleistungen von Service-Punkten in Anspruch nimmt. Diese Schnittstelle ist auch die Basis zur zum Aufrufen von Asynchronen Methoden.

Die Klasse ACPointEventSubscr implementiert IACPointEventSubscr<T>.

 

Workflows

Workflows, die zur Laufzeit geladen werden, sind ereignisgesteuert. Sie verwenden zwei spezielle Implementierungen von IACPointEvent<T> und IACPointEventSubscr<T> - Die Klasse ACPointEvent und PWPointIn (eine Ableitung von PWPointEventSubscr).


Das besondere an Ereignispunkten ist, dass beim Eintritt eines Ereignisses, sogenannte Callback-Methoden bei der Client-Komponente aufgerufen werden. Diese Callbackmethoden haben folgende Signatur:

public delegate void ACPointNetEventDelegate(IACPointNetBase sender, ACEventArgs e, IACObject wrapObject);

Eine Client-Komponete muss eine solche Delegate-Methode bereitstellen und Sie bei der Abbonierung des Ereignisses übergeben, indem eine der Subscribe-Methoden aufgerufen wird, die das Interface IACPointEventSubscr<T> bereitstellt:

ACPointEventSubscrWrap<T> SubscribeEvent(IACObject atACComponent, string eventName, ACPointNetEventDelegate AsyncCallbackDelegate);

ACPointEventSubscrWrap<T> SubscribeEvent(IACObject atACComponent, string eventName, string asyncCallbackDelegateName);

bool SubscribeAllEvents(IACComponent atACComponent, ACPointNetEventDelegate AsyncCallbackDelegate);

 

Zur Abmeldung eines Ereignisses muss der Delegat nicht übergeben werden:

bool UnSubscribeEvent(IACComponent atACComponent, string eventName);

bool UnSubscribeAllEvents(IACComponent atACComponent);

bool UnSubscribeAllEvents(IACComponent atACComponent);

bool UnSubscribeAllEvents();

 


Ereignispunkte ACPointEvent müssen mit der Attributklasse ACPropertyEventPoint versehen werden wie es im folgenden Bespielcode veranschaulicht ist:

 

Um ein Ereignis auszulösen damit alle Abonnenten benachrichtigt werden, muss die Methode Raise() aufgerufen werden. Die Raise-Methode erwartet die Übergabe eines Parameters vom Typ "ACEventArgs". ACEventArgs ist eine Liste vom Typ ACValue. ACEventArgs sind vergleichbar mit der ResultValueList in virtuellen Methoden. Die ACEventArgs-Templates werden in einer lokalen Dictionary<string, ACEventArgs> gespeichert und im statischen Konstruktor registriert. Vor dem Auslösen des Ereignisses, wird mit dem Aufruf der ACEventArgs.GetVirtualEventArgs()-Methode die Parameterliste geklont, anschliessend die Parameter ausgefüllt und zuletzt der Raise-Methode übergeben.


Abonnementpunkte für Ereignise (ACPointEventSubscr) müssen mit der Attributklasse ACPropertyEventPointSubscr versehen werden wie es im folgenden Bespielcode veranschaulicht ist: