Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Current »

Ein Persistenz-Abfänger (Persistence Interceptor) kann verwendet werden, um auf dem Server weitere Logik auszuführen, wenn ein Objekt gespeichert, geladen, gelöscht, etc. wird. Einen Persistenz-Abfänger kann mit einem normaler anonymer Funktion, einem IPersistenceInterceptor oder einem Service aufgebaut werden. Dies sieht folgendermassen aus:

ClassBuilder.PersistenceInterceptor<IDataObject>(
  PersistenceEventTypes,
  (dataObject, context) => {...}
);

ClassBuilder.PersistenceInterceptor<IDataObject, IPersistenceInterceptor<...>>(
  PersistenceEventTypes
);

ClassBuilder.PersistenceInterceptor<IDataObject, PersistenceService>(
  PersistenceEventTypes,
  (dataObject, service, context) => {...}
);

Dabei gibt es folgende PersistenceEventTypes:

PersistenceEventType

Verhalten

BeforeCreate

Wird ausgeführt beim Erstellen eines neuen Eintrags, noch bevor er gespeichert wurde.

AfterCreate

Wird ausgeführt beim Erstellen eines neuen Eintrags, nachdem er gespeichert wurde.

BeforeUpdate

Wird ausgeführt beim Ändern eines bereits bestehendes Eintrags, noch bevor er gespeichert wurde.

AfterUpdate

Wird ausgeführt beim Ändern eines bereits bestehendes Eintrags, nachdem er gespeichert wurde.

BeforeDelete

Wird ausgeführt beim Löschen eines Eintrags, noch bevor er gelöscht wurde.

AfterDelete

Wird ausgeführt beim Löschen eines Eintrags, nachdem er gelöscht wurde.

BeforeLoad

Wird ausgeführt beim Laden der Daten eines Eintrags, noch bevor die Daten geholt wurden.

AfterLoad

Wird ausgeführt beim Laden der Daten eines Eintrags, nachdem die Daten geholt wurden.

BeforeAdHocLoadValues

Wird ausgeführt beim Laden einer Ladegruppe eines Eintrags, noch bevor die Daten geholt wurden.

AfterAdHocLoadValues

Wird ausgeführt beim Laden einer Ladegruppe eines Eintrags, nachdem die Daten geholt wurden.

Diese Event Typen können auch kombiniert werden, zum Beispiel kann man folgendermassen einen Event Typ definieren, der bei jedem Speichern ausgeführt wird:

var beforeSave = PersistenceEventTypes.BeforeCreate | PersistenceEventTypes.BeforeUpdate

DataObject und Context

In der registrierten Funktion hat man jeweils noch zwei Parameter, das Datenobjekt und der Kontext. Auf dem Datenobjekt hat man alle Daten und auch ob sie geändert wurden oder nicht. Mithilfe des Kontexts können gewisse Daten in einen State gespeichert werden, den man im dazugehörigem “After“ Event wieder aus dem Kontext lesen kann. Dieser State ist jedoch nur zwischen einem “Before”- und dem Dazugehörigem “After“ Event zugänglich. Folgende Beispiele dazu:

// Daten holen
dataObject.GetValue(MetaProperty);
// neue Daten Speichern
dataObject.SetValue(MetaProperty, value);

// Im State speichern ("Before" Event)
context.SetState(dataObject, MetaProperty, value);
// Aus dem State holen ("After" Event)
context.TryGetState(dataObject, MetaProperty, out value);

// Geändertes Property im State speichern ("Before" Event)
context.KeepPropertyChangedStates(dataObject, MetaProperty);
// Oder auch für alle Properties auf dem dataObject:
context.KeepAllPropertyChangedStates(dataObject);
// Prüfen ob Property geändert wurde ("Before" Event)
// Kann auch in eimen "After" Event verwendet werden,
// wenn Property im Before event gespeichert wurde
context.PropertyChanged(dataObject, MetaProperty);
// Prüfen ob irgend ein gegebenes Property geändert wurde
context.AnyPropertyChanged(dataObject, params MetaProperty[]);
// Prüfen ob alle gegebene Properties geändert wurden
context.AllPropertiesChanged(dataObject, params MetaProperty[]);

// User, der die Änderung hervorgerufen hat, auslesen
context.TryGetUserIdAndName(dataObject, out userId, out userName);

  • No labels