Vorgehensweise: Erstellen eines benutzerdefinierten Persistenzteilnehmers
Die folgende Prozedur enthält die Schritte zur Erstellung eines Persistenzteilnehmers. Im Beispiel Participating in Persistence und im Artikel Erweiterbarkeit des Speichers finden Sie Implementierungsbeispiele von Persistenzteilnehmern.
Erstellen Sie eine von der PersistenceParticipant-Klasse oder von der PersistenceIOParticipant-Klasse abgeleitete Klasse. Die PersistenceIOParticipant-Klasse bietet die gleichen Erweiterbarkeitspunkte wie die PersistenceParticipant-Klasse und kann zusätzlich dazu in E/A-Vorgänge eingebunden werden. Führen Sie mindestens einen der folgenden Schritte aus.
Implementieren Sie die CollectValues-Methode. Die CollectValues-Methode verfügt über zwei Wörterbuchparameter, einen zum Speichern von Lese-/Schreibwerten und einen zum Speichern von lesegeschützten Werten (wird später in Abfragen verwendet). In dieser Methode müssen Sie diese Wörterbücher mit Daten auffüllen, die für einen Persistenzteilnehmer spezifisch sind. Jedes Wörterbuch enthält den Namen des Werts als Schlüssel und den Wert selbst als InstanceValue-Objekt.
Die Werte im readWriteValues-Wörterbuch werden als InstanceValue-Objekte gepackt. Die Werte im lesegeschützten Wörterbuch werden als InstanceValue-Objekte gepackt, wobei InstanceValueOptions.Optional und InstanceValueOption.WriteOnly festgelegt sind. Jedes InstanceValue-Objekt, das von den CollectValues-Implementierungen für die einzelnen Persistenzteilnehmer bereitgestellt wird, muss über einen eindeutigen Namen verfügen.
protected virtual void CollectValues(out IDictionary<XName,Object> readWriteValues, out IDictionary<XName,Object> writeOnlyValues) { }
Implementieren Sie die MapValues-Methode. Die MapValues-Methode akzeptiert zwei Parameter, die den Parametern für die CollectValues-Methode ähneln. Alle in der CollectValues-Phase gesammelten Werte werden über diese Wörterbuchparameter übergeben. Den lesegeschützten Werten werden die neuen von der MapValues-Phase hinzugefügten Werte hinzugefügt. Das lesegeschützte Wörterbuch wird verwendet, um Daten für eine externe Quelle bereitzustellen, die nicht direkt den Instanzwerten zugeordnet ist. Jeder von Implementierungen der MapValues-Methode bereitgestellte Wert für alle Persistenzteilnehmer muss über einen eindeutigen Namen verfügen.
protected virtual IDictionary<XName,Object> MapValues(IDictionary<XName,Object> readWriteValues,IDictionary<XName,Object> writeOnlyValues) { }
Die MapValues-Methode stellt Funktionen bereit, die von CollectValues nicht bereitgestellt werden, und zwar im Hinblick darauf, dass sie eine Abhängigkeit von einem anderen Wert zulässt, der von einem anderen Persistenzteilnehmer bereitgestellt wird, der noch nicht von CollectValues verarbeitet wurde.
Implementieren Sie die PublishValues-Methode. Die PublishValues-Methode empfängt ein Wörterbuch, das alle aus dem Persistenzspeicher geladenen Werte enthält.
protected virtual void PublishValues(IDictionary<XName,Object> readWriteValues) { }
Implementieren Sie die BeginOnSave-Methode, falls der Teilnehmer ein E/A-Persistenzteilnehmer ist. Diese Methode wird während eines Save-Vorgangs aufgerufen. Bei dieser Methode müssen Sie zusätzlich zu den Workflowinstanzen für die persistente Speicherung E/A-Vorgänge ausführen. Wenn der Host eine Transaktion für den entsprechenden Persistenzbefehl verwendet, wird die gleiche Transaktion in Transaction.Current bereitgestellt. Darüber hinaus zeigen PersistenceIOParticipants möglicherweise eine Transaktionskonsistenzanforderung an. In diesem Fall erstellt der Host gegebenenfalls eine Transaktion für den Persistenzabschnitt.
protected virtual IAsyncResult BeginOnSave(IDictionary<XName,Object> readWriteValues, IDictionary<XName,Object> writeOnlyValues, TimeSpan timeout, AsyncCallback callback, Object state) { }
Implementieren Sie die BeginOnLoad-Methode, falls der Teilnehmer ein E/A-Persistenzteilnehmer ist. Diese Methode wird während eines Load-Vorgangs aufgerufen. In dieser Methode müssen Sie zusätzlich zum Laden von Workflowinstanzen E/A-Vorgänge ausführen. Wenn der Host eine Transaktion für den entsprechenden Persistenzbefehl verwendet, wird die gleiche Transaktion in Transaction.Current bereitgestellt. Darüber hinaus zeigen E/A-Persistenzteilnehmer möglicherweise eine Transaktionskonsistenzanforderung an. In diesem Fall erstellt der Host gegebenenfalls eine Transaktion für den Persistenzabschnitt.
protected virtual IAsyncResult BeginOnLoad(IDictionary<XName,Object> readWriteValues, TimeSpan timeout, AsyncCallback callback, Object state) { }