Procedura: creare un partecipante di persistenza personalizzato
Nella procedura riportata di seguito sono illustrati i passaggi per creare un partecipante di persistenza. Per informazioni sulle implementazioni dei partecipanti di persistenza, vedere l'esempio sulla partecipazione alla persistenza e l'argomento Estendibilità dell'archivio.
Creare una classe che deriva dalla classe PersistenceParticipant o PersistenceIOParticipant. Oltre alla possibilità di partecipare alle operazioni di I/O, la classe PersistenceIOParticipant dispone degli stessi punti di estensibilità della classe PersistenceParticipant. Attenersi ad almeno uno dei passaggi seguenti.
Implementa il metodo CollectValues. Il metodo CollectValues dispone di due parametri di dizionario, uno per l'archiviazione di valori di lettura/scrittura e l'altro per l'archiviazione di valori di sola scrittura (usati di seguito nelle query). In tale metodo, è necessario popolare questi dizionari con i dati specifici di un partecipante di persistenza. Ogni dizionario contiene il nome del valore come chiave e il valore stesso come oggetto InstanceValue.
I valori del dizionario readWriteValues vengono configurati in pacchetti come oggetti InstanceValue, mentre i valori del dizionario di sola scrittura vengono configurati in pacchetti come oggetti InstanceValue con gli oggetti InstanceValueOptions.Optional e InstanceValueOption.WriteOnly impostati. Il nome di ogni oggetto InstanceValue fornito dalle implementazioni CollectValues in tutti i partecipanti di persistenza deve essere univoco.
protected virtual void CollectValues(out IDictionary<XName,Object> readWriteValues, out IDictionary<XName,Object> writeOnlyValues) { }
Implementa il metodo MapValues. Il metodo MapValues accetta due parametri simili ai parametri ricevuti dal metodo CollectValues. Tutti i valori raccolti nella fase CollectValues vengono passati tramite questi parametri di dizionario. I nuovi valori aggiunti dalla fase MapValues vengono aggiunti ai valori di sola scrittura. Il dizionario di sola scrittura viene usato per fornire dati a un'origine esterna non direttamente associata ai valori dell'istanza. Il nome di ogni valore fornito dalle implementazioni del metodo MapValues in tutti i partecipanti di persistenza deve essere univoco.
protected virtual IDictionary<XName,Object> MapValues(IDictionary<XName,Object> readWriteValues,IDictionary<XName,Object> writeOnlyValues) { }
Il metodo MapValues fornisce la funzionalità che non è offerta da CollectValues, nel senso che consente di usare una dipendenza da un altro valore fornito da un altro partecipante di persistenza che non è stato ancora elaborato da CollectValues.
Implementare il metodo PublishValues. Il metodo PublishValues riceve un dizionario contenente tutti i valori caricati dall'archivio di persistenza.
protected virtual void PublishValues(IDictionary<XName,Object> readWriteValues) { }
Implementare il metodo BeginOnSave se il partecipante è un partecipante di I/O di persistenza. Questo metodo viene chiamato durante un'operazione di salvataggio. In questo metodo, è necessario eseguire l'aggiunta di I/O alla persistenza delle istanze del flusso di lavoro (salvataggio). Se l'host sta usando una transazione per il comando di persistenza corrispondente, la stessa transazione viene fornita in Transaction.Current. Inoltre, l'oggetto PersistenceIOParticipants può annunciare un requisito di coerenza transazionale e, in tal caso, l'host crea una transazione per l'episodio di persistenza, qualora non venisse altrimenti usata.
protected virtual IAsyncResult BeginOnSave(IDictionary<XName,Object> readWriteValues, IDictionary<XName,Object> writeOnlyValues, TimeSpan timeout, AsyncCallback callback, Object state) { }
Implementare il metodo BeginOnLoad se il partecipante è un partecipante di I/O di persistenza. Questo metodo viene chiamato durante un'operazione di caricamento. In questo metodo, è necessario eseguire l'aggiunta di I/O al caricamento delle istanze del flusso di lavoro. Se l'host sta usando una transazione per il comando di persistenza corrispondente, la stessa transazione viene fornita in Transaction.Current. Inoltre, i partecipanti di I/O di persistenza possono annunciare un requisito di coerenza transazionale e, in tal caso, l'host crea una transazione per l'episodio di persistenza, qualora non venisse altrimenti usata.
protected virtual IAsyncResult BeginOnLoad(IDictionary<XName,Object> readWriteValues, TimeSpan timeout, AsyncCallback callback, Object state) { }