Compartir a través de


Procedimiento para crear un participante de persistencia personalizado

El siguiente procedimiento describe los pasos para crear un participante de persistencia. Consulte el ejemplo Persistencia y el tema Extensibilidad de almacén para ver implementaciones de ejemplo de participantes de persistencia.

  1. Cree una clase que derive de la clase PersistenceParticipant o PersistenceIOParticipant. La clase PersistenceIOParticipant proporciona los mismos puntos de extensibilidad que la clase PersistenceParticipant, además de poder participar en operaciones de E/S. Siga uno o varios de los pasos siguientes:

  2. Implemente el método CollectValues. El método CollectValues tiene dos parámetros de diccionario, uno para almacenar los valores de lectura y escritura, y otro para almacenar los valores de solo escritura (se usa después en las consultas). En este método, debería rellenar estos diccionarios con datos que sean específicos de un participante de persistencia. Cada diccionario contiene el nombre del valor como clave y el propio valor como un objeto InstanceValue.

    Los valores del diccionario readWriteValues se empaquetan como objetos InstanceValue. Los valores del diccionario de solo escritura se empaquetan como objetos InstanceValue con las opciones InstanceValueOptions.Optional e InstanceValueOption.WriteOnly establecidas. Cada InstanceValue proporcionado por las implementaciones de CollectValues en todos los participantes de persistencia debe tener un nombre único.

    protected virtual void CollectValues(out IDictionary<XName,Object> readWriteValues, out IDictionary<XName,Object> writeOnlyValues)
    {
    }
    
  3. Implemente el método MapValues. El método MapValues toma dos parámetros que son similares a los parámetros que el método CollectValues recibe. Todos los valores recopilados en la fase CollectValues se pasan a través de estos parámetros de diccionario. Los nuevos valores agregados por la fase MapValues se agregan a los valores de solo escritura. El diccionario de solo escritura se usa para proporcionar datos a un origen externo no asociado directamente a valores de la instancia. Cada valor proporcionado por implementaciones del método MapValues en todos los participantes de persistencia debe tener un nombre único.

    protected virtual IDictionary<XName,Object> MapValues(IDictionary<XName,Object> readWriteValues,IDictionary<XName,Object> writeOnlyValues)
    {
    }
    

    El método MapValues proporciona funcionalidad que CollectValues no ofrece; permite una dependencia de otro valor proporcionado por otro participante de persistencia que CollectValues no ha procesado todavía.

  4. Implemente el método PublishValues. El método PublishValues recibe un diccionario que contiene todos los valores cargados del almacén de persistencia.

    protected virtual void PublishValues(IDictionary<XName,Object> readWriteValues)
    {
    }
    
  5. Implemente el método BeginOnSave si el participante es un participante de E/S de persistencia. A este método se llama durante una operación de almacenamiento. En este método, debe realizar operaciones de E/S como complemento de la persistencia (almacenamiento) de instancias de flujo de trabajo. Si el host está usando una transacción para el comando de persistencia correspondiente, se proporciona la misma transacción en Transaction.Current. Además, PersistenceIOParticipants puede anunciar un requisito de coherencia transaccional, en cuyo caso el host crea una transacción para el episodio de persistencia si, por el contrario, no se usara uno.

    protected virtual IAsyncResult BeginOnSave(IDictionary<XName,Object> readWriteValues, IDictionary<XName,Object> writeOnlyValues, TimeSpan timeout, AsyncCallback callback, Object state)
    {
    }
    
  6. Implemente el método BeginOnLoad si el participante es un participante de E/S de persistencia. A este método se llama durante una operación de carga. En este método, debe realizar operaciones de E/S como complemento de la carga de instancias de flujo de trabajo. Si el host está usando una transacción para el comando de persistencia correspondiente, se proporciona la misma transacción en Transaction.Current. Además, los participantes de E/S de persistencia pueden anunciar un requisito de coherencia transaccional, en cuyo caso el host crea una transacción para el episodio de persistencia si, de lo contrario, no se usara uno.

    protected virtual IAsyncResult BeginOnLoad(IDictionary<XName,Object> readWriteValues, TimeSpan timeout, AsyncCallback callback, Object state)
    {
    }