Compartilhar via


Como: criar um participante de persistência personalizado

O seguinte procedimento tem as etapas para criar um participante de persistência. Consulte a amostra Participação na persistência e o tópico Extensibilidade de armazenamento para implementações de amostra de participantes de persistência.

  1. Crie uma classe que deriva de PersistenceParticipant ou classe de PersistenceIOParticipant . A classe PersistenceIOParticipant oferece os mesmos pontos de extensibilidade que a classe PersistenceParticipant além de poder participar em operações de E/S. Execute uma ou mais das seguintes etapas.

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

    Os valores no dicionário readWriteValues são empacotados como objetos de InstanceValue. Os valores no dicionário de somente gravação são empacotados como objetos de InstanceValue com conjunto de InstanceValueOptions.Optional e de InstanceValueOption.WriteOnly. Cada InstanceValue fornecido por implementações de CollectValues por 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. Implementar o método de MapValues . O método MapValues leva dois parâmetros que são semelhantes aos parâmetros que o método CollectValues receber. Todos os valores coletados na fase de CollectValues são passados por esses parâmetros de dicionário. Os novos valores adicionados pela fase de MapValues são adicionados aos valores de somente gravação. O dicionário somente gravação é usado para fornecer dados para uma fonte externa associada não diretamente com os valores da instância. Cada valor fornecido por implementações do método MapValues por 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 método de MapValues fornece funcionalidade que o CollectValues contrário, que permite uma dependência em outro valor fornecido por outro participante de persistência que não é processado pelo CollectValues ainda.

  4. Implementar o método PublishValues. O método PublishValues recebe um dicionário que contém todos os valores carregados de armazenamento de persistência.

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

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

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