Udostępnij za pośrednictwem


Instrukcje: Tworzenie niestandardowego uczestnika stanów trwałych

Poniższa procedura zawiera kroki tworzenia uczestnika trwałości. Zapoznaj się z przykładowym przykładem trwałości i tematem Rozszerzalności sklepu, aby zapoznać się z przykładowymi implementacjami uczestników trwałości.

  1. Utwórz klasę pochodzącą z PersistenceParticipant klasy lub PersistenceIOParticipant . Klasa PersistenceIOParticipant oferuje te same punkty rozszerzalności co klasa PersistenceParticipant oprócz możliwości uczestnictwa w operacjach we/wy. Wykonaj co najmniej jedną z poniższych czynności.

  2. Zaimplementuj metodę CollectValues . Metoda CollectValues ma dwa parametry słownika, jeden do przechowywania wartości odczytu/zapisu, a drugi do przechowywania wartości tylko do zapisu (używany później w zapytaniach). W tej metodzie należy wypełnić te słowniki danymi specyficznymi dla uczestnika trwałości. Każdy słownik zawiera nazwę wartości jako klucz i samą wartość jako InstanceValue obiekt.

    Wartości w słowniku readWriteValues są pakowane jako obiekty InstanceValue . Wartości w słowniku tylko do zapisu są pakowane jako obiekty InstanceValue z ustawioną wartością InstanceValueOptions.Optional i InstanceValueOption.WriteOnly. Każda wartość wystąpienia dostarczana przez implementacje CollectValues dla wszystkich uczestników trwałości musi mieć unikatową nazwę.

    protected virtual void CollectValues(out IDictionary<XName,Object> readWriteValues, out IDictionary<XName,Object> writeOnlyValues)
    {
    }
    
  3. Zaimplementuj metodę MapValues . Metoda MapValues przyjmuje dwa parametry podobne do parametrów odbieranych przez metodę CollectValues . Wszystkie wartości zebrane na etapie CollectValues są przekazywane za pośrednictwem tych parametrów słownika. Nowe wartości dodane przez etap MapValues są dodawane do wartości tylko do zapisu. Słownik tylko do zapisu służy do dostarczania danych do źródła zewnętrznego, które nie jest bezpośrednio skojarzone z wartościami wystąpienia. Każda wartość dostarczana przez implementacje metody MapValues dla wszystkich uczestników trwałości musi mieć unikatową nazwę.

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

    Metoda MapValues udostępnia funkcje, które CollectValues nie umożliwiają zależności od innej wartości dostarczonej przez innego uczestnika trwałości, który nie został jeszcze przetworzony CollectValues .

  4. Zaimplementuj metodę PublishValues . Metoda PublishValues odbiera słownik zawierający wszystkie wartości załadowane z magazynu trwałości.

    protected virtual void PublishValues(IDictionary<XName,Object> readWriteValues)
    {
    }
    
  5. Zaimplementuj metodę BeginOnSave , jeśli uczestnik jest uczestnikiem operacji we/wy trwałości. Ta metoda jest wywoływana podczas operacji Zapisywania. W tej metodzie należy wykonać skojarzenie we/wy z wystąpieniami przepływu pracy utrwalania (zapisywania). Jeśli host używa transakcji dla odpowiedniego polecenia trwałości, ta sama transakcja jest podana w Transaction.Current. Ponadto elementy PersistenceIOParticipants mogą anonsować wymaganie spójności transakcyjnej, w tym przypadku host tworzy transakcję dla epizodu trwałości, jeśli nie zostanie użyty w inny sposób.

    protected virtual IAsyncResult BeginOnSave(IDictionary<XName,Object> readWriteValues, IDictionary<XName,Object> writeOnlyValues, TimeSpan timeout, AsyncCallback callback, Object state)
    {
    }
    
  6. Zaimplementuj metodę BeginOnLoad , jeśli uczestnik jest uczestnikiem operacji we/wy trwałości. Ta metoda jest wywoływana podczas operacji ładowania. W tej metodzie należy wykonać operacje we/wy do ładowania wystąpień przepływu pracy. Jeśli host używa transakcji dla odpowiedniego polecenia trwałości, ta sama transakcja jest podana w Transaction.Current. Ponadto uczestnicy operacji we/wy trwałości mogą anonsować wymaganie spójności transakcyjnej, w tym przypadku host tworzy transakcję dla epizodu trwałości, jeśli nie zostanie użyty w inny sposób.

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