Синхронизация базовых единиц
Базовая единица представляет изменение подэлемента, например поля телефонного номера в элементе, представляющем карточку контакта. Использование базовых единиц в службах синхронизации позволяет более эффективно синхронизировать изменения подэлементов. Примерами служб, где можно воспользоваться базовыми единицами, служат службы диспетчера личных данных (PIM) и службы, обрабатывающие изображения с метаданными.
Базовые единицы
Базовые единицы позволяют представлять изменения компактных подэлементов и поддерживают более точное отслеживание изменений. Это может сократить число конфликтов, которые возникают при внесении изменений в элемент.
Рассмотрим элемент, представляющий карточку контакта, сохраненную в файловой системе. Если гранулярность отслеживания изменений находится на уровне элементов (файлов), то любое изменение файла будет расцениваться как изменение элемента и потребует передачи всех данных в карточке контакта. Используя базовые единицы, служба может принять решение об обнаружении изменений и разрешении конфликтов в данных на уровне свойств контакта, таких как имя, фамилия и телефонный номер. В этом случае, когда две реплики независимо изменяют различные свойства контакта, например одна реплика изменяет адрес электронной почты, а другая добавляет изображение, конфликт на уровне элемента не регистрируется и необходимо отправить только данные базовых единиц.
Набор базовых единиц фактически образует схему, в которой порядок базовых единиц определяется репликами, которые синхронизируют конкретную схему. Например, реплики могут выбрать для свойств контакта следующее представление:
Change Unit[0] = First Name
Change Unit[1] = Last Name
Change Unit[2] = Phone Number
Удаление базовых единиц
Время существования базовой единицы привязано ко времени существования элемента. В отличие от обычных элементов изменения, базовые единицы нельзя удалять, поскольку реплики пришли к заключению, что базовые единицы являются свойствами элемента.
Добавление базовых единиц
Службы не должны самостоятельно создавать базовые единицы, поскольку это может повлечь нежелательные эффекты.
Базовые единицы можно добавлять в рамках обновлений схемы, которые выполняются отдельно от синхронизации данных. Для этого необходимо, чтобы базовые единицы имели значение null или значение по умолчанию, принимаемое на всех репликах. Тогда версия обновления для добавляемых базовых единиц будет версией создания элемента до изменения этих базовых единиц. В результате такой обработки добавленные базовые единицы представляются компонентам приложения аналогично базовым единицам, которые существовали с самого начала и никогда не изменялись.
Перечисление изменений базовых единиц
Когда поставщик источника использует базовые единицы для представления подэлементов, которые перечисляются из реплики-источника, он отправляет только изменившиеся базовые единицы, а не элемент целиком. Учтите, что если элемент содержит базовые единицы, то хранятся только сведения о версии для каждой базовой единицы, а не для самого элемента.
Перечисление изменений базовых единиц в управляемом коде
Чтобы определить базовые единицы, подлежащие отправке, поставщик источника использует метод Contains или Contains объекта SyncKnowledge из поставщика назначения. Если изменение базовой единицы не содержится в наборе знаний назначения, то это изменение необходимо включить в пакет изменений, отправляемый поставщиком источника.
Изменения базовых единиц содержатся в изменениях элементов, которые добавляются в пакет изменений. Можно создать объект ItemChange, содержащий изменения базовых единиц, вызвав конструктор ItemChange, или добавить изменения базовых единиц, вызвав метод AddChangeUnitChange.
Перечисление изменений базовых единиц в неуправляемом коде
Чтобы определить базовые единицы, подлежащие отправке, поставщик источника использует метод ISyncKnowledge::ContainsChangeUnit объекта ISyncKnowledge из поставщика назначения. Если изменение базовой единицы не содержится в наборе знаний назначения, то это изменение необходимо включить в пакет изменений, отправляемый поставщиком источника.
Изменения базовых единиц содержатся в изменениях элементов, которые добавляются в пакет изменений. Чтобы добавить изменения базовых единиц, укажите в параметре ppChangeBuilder метода ISyncChangeBatchBase::AddItemMetadataToGroup значение, отличное от NULL. Затем возращенный объект ISyncChangeBuilder можно использовать для добавления изменений базовых единиц в соответствующее изменение элемента с помощью метода ISyncChangeBuilder::AddChangeUnitMetadata.
Обработка изменений базовых единиц
Когда поставщик назначения использует модуль применения изменений для обработки пакета изменений в методе ProcessChangeBatch (для управляемого кода) или методе IKnowledgeSyncProvider::ProcessChangeBatch (для неуправляемого кода), поставщик назначения выполняет перечисление сведений о версии назначения для каждого изменения, полученного от поставщика источника. Если изменение источника содержит изменения базовых единиц, поставщик назначения должен определить, какие версии базовых единиц нужно включить в пакет версий назначения. Это решение зависит от типа изменений на поставщике источника, а также от того, помечен ли элемент как удаленный в реплике назначения. В следующей таблице показано, какие сведения о версии поставщик назначения должен отправлять в модуль применения изменений.
Изменением источника является удаление |
Изменением источника является обновление |
|
Удален элемент назначения |
Только версия элемента назначения. Удаление допускается только для целых элементов. Поэтому сведения о версии для операции удаления отслеживаются для целого элемента. |
Только версия элемента назначения. Удаление допускается только для целых элементов. Поэтому сведения о версии для операции удаления отслеживаются для целого элемента. |
Элемент назначения не удален |
Версии всех базовых единиц назначения. |
Только версии базовых единиц назначения, которые перечислены из источника. |
Обработка конфликтов, в которых участвуют базовые единицы
Если в приложении применяется нестандартное разрешение конфликтов для изменений, в которых участвуют базовые единицы, обычно приложение должно задавать действие по разрешению конфликта базовых единиц с помощью метода SetResolutionAction (для управляемого кода) или метода IChangeConflict::SetResolveActionForChangeUnit (для неуправляемого кода).
Однако если конфликт вызван обновлением в одной реплики и удалением в другой реплике, то приложение должно указать действие по разрешению конфликта на уровне элементов с помощью метода SetResolutionAction (для управляемого кода) или метода IChangeConflict::SetResolveActionForChange (для неуправляемого кода).
Применение изменений базовых единиц
Обычно, если изменение содержит базовые единицы, службы Sync Framework вызывают метод SaveChangeWithChangeUnits (для управляемого кода) или метод ISynchronousNotifyingChangeApplierTarget::SaveChangeWithChangeUnits (для неуправляемого кода), чтобы применить изменение в реплике назначения. Однако если произошел конфликт, который был разрешен путем удалением элемента, то службы Sync Framework вызывают метод SaveItemChange (для управляемого кода) или метод ISynchronousNotifyingChangeApplierTarget::SaveChange (для неуправляемого кода). Это объясняется тем, что удаляться могут только целые элементы, а не отдельные базовые единицы.