Как создать настраиваемого участника сохраняемости
В следующей процедуре содержаться шаги для создания участника сохраняемости. Примеры реализации сохраняемости участников см. в разделе " Участие в сохраняемости " и разделе "Расширяемость хранилища" для примеров реализаций участников сохраняемости .
Создайте класс, который происходит от класса PersistenceParticipant или PersistenceIOParticipant. Класс PersistenceIOParticipant предлагает те же точки расширяемости, что и класс PersistenceParticipant, а также возможность участвовать в операциях ввода-вывода. Выполните один или несколько следующих шагов.
Реализуйте метод CollectValues. Метод CollectValues имеет два параметра словаря, один для хранения значений чтения и записи, а другой — для хранения значений только для записи (используемых далее в запросах). В этом методе необходимо заполнить словари данными, соответствующими участнику сохраняемости. Каждый словарь содержит имя значения в качестве ключа и само значение в качестве объекта InstanceValue.
Значения в словаре readWriteValues упаковываются в виде объектов InstanceValue . Значения в словаре только для записи упаковываются в виде объектов InstanceValue с помощью InstanceValueOptions.Optional и InstanceValueOption.WriteOnly. Каждое значение InstanceValue, предоставляемое реализацией CollectValues для всех участников сохраняемости, должно иметь уникальное имя.
protected virtual void CollectValues(out IDictionary<XName,Object> readWriteValues, out IDictionary<XName,Object> writeOnlyValues) { }
Реализуйте метод MapValues. Метод MapValues принимает два параметра, аналогичные параметрам, получаемым методом CollectValues . Все значения, собранные на этапе CollectValues , передаются через эти параметры словаря. Новые значения, добавленные этапом MapValues , добавляются в значения, доступные только для записи. Доступный только на запись словарь используется для передачи данных во внешний источник данных, не связанный напрямую со значениями экземпляра. Каждое значение, предоставленное реализацией метода MapValues для всех участников сохраняемости, должно иметь уникальное имя.
protected virtual IDictionary<XName,Object> MapValues(IDictionary<XName,Object> readWriteValues,IDictionary<XName,Object> writeOnlyValues) { }
Метод MapValues предоставляет функциональность, не реализуемую CollectValues, а именно допускает зависимость от другого значения, предоставленного другим участником сохраняемости, который еще не был обработан CollectValues.
Реализуйте метод PublishValues. Метод PublishValues получает словарь, содержащий все значения, загруженные из хранилища сохраняемости.
protected virtual void PublishValues(IDictionary<XName,Object> readWriteValues) { }
Реализуйте метод BeginOnSave, если участник является участником сохраняемости ввода-вывода. Метод вызывается во время создания сохранения. В этом методе необходимо выполнить отложение ввода-вывода к экземплярам сохраняющихся (сохраненных) рабочих процессов. Если узел использует транзакцию для соответствующей команды сохраняемости, та же самая транзакция используется в Transaction.Current. Помимо этого, PersistenceIOParticipants могут объявить о требовании к совместимости транзакций, в случае чего узел создаст транзакцию для сеанса сохраняемости, если такая транзакция не будет использована иначе.
protected virtual IAsyncResult BeginOnSave(IDictionary<XName,Object> readWriteValues, IDictionary<XName,Object> writeOnlyValues, TimeSpan timeout, AsyncCallback callback, Object state) { }
Реализуйте метод BeginOnLoad, если участник является участником сохраняемости ввода-вывода. Метод вызывается во время создания загрузки. В этом методе необходимо выполнить отложение ввода-вывода к загрузке экземпляров рабочих процессов. Если узел использует транзакцию для соответствующей команды сохраняемости, та же самая транзакция используется в Transaction.Current. Кроме того, участники сохраняемости операций ввода-вывода могут объявлять требование согласованности транзакций, в этом случае узел создает транзакцию для эпизода сохраняемости, если он не будет использоваться в противном случае.
protected virtual IAsyncResult BeginOnLoad(IDictionary<XName,Object> readWriteValues, TimeSpan timeout, AsyncCallback callback, Object state) { }