Partilhar via


Como criar um participante de persistência personalizado

O procedimento a seguir tem etapas para criar um participante de persistência. Consulte o tópico Participando do exemplo de persistência e Extensibilidade de armazenamento para obter exemplos de implementações de participantes de persistência.

  1. Crie uma classe derivada da PersistenceParticipant ou da PersistenceIOParticipant classe. A classe PersistenceIOParticipant oferece os mesmos pontos de extensibilidade que a classe PersistenceParticipant, além de poder participar de operações de E/S. Siga uma ou mais das etapas a seguir.

  2. Implemente o CollectValues método. O método CollectValues tem dois parâmetros de dicionário, um para armazenar valores de leitura/gravação e outro para armazenar valores somente gravação (usados posteriormente em consultas). Nesse método, você deve preencher esses dicionários com dados específicos de um participante de persistência. Cada dicionário contém o nome do valor como a chave e o próprio valor como um InstanceValue objeto.

    Os valores no dicionário readWriteValues são empacotados como objetos InstanceValue . Os valores no dicionário somente gravação são empacotados como objetos InstanceValue com InstanceValueOptions.Optional e InstanceValueOption.WriteOnly definidos. Cada InstanceValue fornecido pelas implementações CollectValues em todos os participantes de persistência deve ter um nome exclusivo.

    protected virtual void CollectValues(out IDictionary<XName,Object> readWriteValues, out IDictionary<XName,Object> writeOnlyValues)
    {
    }
    
  3. Implemente o MapValues método. O método MapValues usa dois parâmetros que são semelhantes aos parâmetros que o método CollectValues recebe. Todos os valores coletados no estágio CollectValues são passados por esses parâmetros do dicionário. Os novos valores adicionados pelo estágio MapValues são adicionados aos valores somente gravação. O dicionário somente gravação é usado para fornecer dados a uma fonte externa não diretamente associada aos valores da instância. Cada valor fornecido por implementações do método MapValues em todos os participantes de persistência deve ter um nome exclusivo.

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

    O MapValues método fornece funcionalidade que CollectValues não, na medida em que permite uma dependência de outro valor fornecido por outro participante de persistência que ainda não foi processado CollectValues .

  4. Implemente o método PublishValues . O método PublishValues recebe um dicionário contendo todos os valores carregados do repositório de persistência.

    protected virtual void PublishValues(IDictionary<XName,Object> readWriteValues)
    {
    }
    
  5. Implemente o método BeginOnSave se o participante for um participante de E/S de persistência. Este método é chamado durante uma operação Save. Nesse método, você deve executar o adjunto de E/S para as instâncias de fluxo de trabalho persistentes (salvando). Se o host estiver usando uma transação para o comando persistence correspondente, a mesma transação será fornecida em Transaction.Current. Além disso, PersistenceIOParticipants pode anunciar um requisito de consistência transacional, caso em que o host cria uma transação para o episódio de persistência se uma não seria usada de outra forma.

    protected virtual IAsyncResult BeginOnSave(IDictionary<XName,Object> readWriteValues, IDictionary<XName,Object> writeOnlyValues, TimeSpan timeout, AsyncCallback callback, Object state)
    {
    }
    
  6. Implemente o método BeginOnLoad se o participante for um participante de E/S de persistência. Este método é chamado durante uma operação Load. Nesse método, você deve executar o adjunto de E/S para o carregamento de instâncias de fluxo de trabalho. Se o host estiver usando uma transação para o comando persistence correspondente, a mesma transação será fornecida em Transaction.Current. Além disso, os participantes de E/S de persistência podem anunciar um requisito de consistência transacional, caso em que o host cria uma transação para o episódio de persistência, caso uma não seja usada de outra forma.

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