Erweiterte Programmierung


In den zwei vorhergehenden Kapiteln wurde die Klasse ACRef<T> und das Interface IACPoint<T> erklärt.

ACRef<T> ermöglicht eine Unidirektionale Referenz zu einer ACComponent-Instanz.

Die Klasse PAPoint, die IACPoint<T> implementiert, kann in der ConnectionList-Eigenschaft mehrere PAEdge Instanzen speichern. Die PAEdge Klasse widerum sellt eine bidirektionale Verbindung zwischen zwei Verbindungspunkten (indirekt zwei Komponenten) dar.

Mit diesen Mitteln kann man nun mehrere bidirektionale Beziehungen in einer Liste speichern - allerdings nur zwischen Instanzen aus der selben Anwendungsdomäne!

Das bedeutet konkret, dass sich die beiden Punkte (bzw. ACComponent-Instanzen) kennen müssen - unabhängig davon ob eine Instanz davon eine reelle oder Proxy-Instanz ist. Eine Beziehung zu einer unbekannten Instanz aus einer anderen Anwendungsdomäne kann mit dieser Technik nicht abgebildet werden. Hier kommen sogenannte Service-Punkte ins Spiel.

Ein konkretes Beispiel ist, dass ein Benutzer auf dem Rechner A ein Businessobjekt nutzt (geöffnetes Programm in der Registerkarte) das Ereignisse von einer reellen Instanz (serverseitig), die auf Rechner B läuft, empfangen möchte. Die serverseitige Instanz kann weder den Speicherraum des Clients (Rechner A) kennen noch die Businessobjektinstanz (weil diese z.B. mehrfach geöffnet sein kann). Zudem könnten auch noch viele andere Rechner an dem Ereignis dieser serverseitigen Instanz interessiert sein.

Bevor wir auf die Ereignis-Punkte näher eingehen, die im nächsten Kapitel behandelt werden, schauen wir uns zuerst

an (blau gestrichelter Rahmen):

 

IACPointNetServiceObject<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 Ereignissen und Asynchronen Methoden.

Die Klasse ACPointServiceACObject implementiert IACPointNetServiceObject<T>. Mit ACPointServiceACObject-Instanzen können Komponenten einen Dienst bereitstellen bei denen Konsumenten Aufgaben in die ConnectionList eintragen können welche die Komponente abarbeitet. Konsumenten (Komponenten aus der selben oder einer entfernten Anwendungsdomäne) können die ConnectionList nicht direkt befüllen sondern benötigen die Schnittstelle IACPointNetClientObject:

IACPointNetClientObject<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 Abbonierung von Ereignissen und zum Aufrufen von Asynchronen Methoden.

 Die Klasse ACPointClientACObject implementiert IACPointNetClientObject<T>.


Der folgende Programmcode zeigt ein Beispiel wie man die Klasse ACPointServiceACObject verwendet. Dieser Service-Punkt wird in einer Komponente verwendet, die eine Maschine repräsentieren soll. Die Maschine kann zu einem Zeitpunkt nur von einem Konsumenten bzw. Arbeiter genutzt bzw. reserviert werden. Deswegen wurde oberhalb der Definition der MappingServicePoint-Eigenschaft die Attributklasse ACPropertyPoint mit einer Kapazität von "1" deklariert:

 

Durch setzen des SetMethod-Delegaten mit der Methode "OnSetMappingServicePoint", wird die Methode immer dann aufgerufen, wenn ein neuer Eintrag in die ConnectionList des Service-Punktes erfolgt ist. In obigen Beispiel kann die ConnectionList nur ein Element enthalten, weil sie durch Limit = "1" begrenzt wurde.


Der Konsument dagegen, der die Maschine exklusiv für sich belegen möchte, verwendet ACPointClientACObject indem er die Methode AddToServicePoint() aufruft. Per RemoveFromServicePoint() wird die Reservierung entfernt:

 

Die AddToServicePoint()-Methode gibt eine ACPointNetWrapObject<ACComponent>-Instanz mit dem Status PointProcessingState.Accepted zurück, falls der Service-Punkt diese Anfrage akzeptiert hat. Die ACPointNetWrapObject<ACComponent>-Instanz befindet sich in beiden ConnectionList (im Service-Punkt als auch im Client-Punkt). Bitte beachten Sie, dass Sie ACPointNetWrapObject<ACComponent>-Instanzen nicht mit dem Gleichheits-Operator "==" vergleichen können, weil sie durch Netzwerkübertragungen (im Hintergrund) neue Speicheradressen erhalten. Ein Vergleich können Sie durch die CompareTo()-Methode erreichen oder durch den Vergleich der Eigenschaft RequestID.