Sincronizar las unidades de cambio
Una unidad de cambio representa un cambio de subelemento, como el campo de número de teléfono en un elemento que representa una tarjeta de visita. Mediante unidades de cambio, los proveedores pueden sincronizar los cambios de subelemento más eficazmente. Algunos ejemplos de proveedores que podrían aprovecharse de las unidades de cambio son los del Administrador de información personal (PIM) y los que administran imágenes con sus metadatos.
Unidades de cambio
Las unidades de cambio permiten que los cambios de los subelementos compactos se representen y se sigan con una mayor precisión en el seguimiento de cambios. De esta forma se puede reducir el número de conflictos que se generan cuando se efectúan cambios en el elemento.
Considere un elemento que representa una tarjeta de visita que se almacena en un sistema de archivos. Si la granularidad del seguimiento de cambios correspondiera al nivel de elemento (archivo), cualquier cambio del archivo se consideraría un cambio de elemento y tendrían que transferirse todos los datos del contacto. Mediante unidades de cambio, un proveedor puede decidir por el contrario detectar los cambios y resolver los conflictos de los datos en el nivel de propiedad del contacto, por ejemplo en los datos de Nombre, Apellido y Número de teléfono. En este caso, si dos réplicas cambian independientemente propiedades diferentes de un contacto, por ejemplo si una modifica la dirección de correo electrónico y la otra asocia una imagen, no se detecta ningún conflicto en el nivel de elemento y sólo se deben enviar los datos de la unidad de cambio.
El conjunto de unidades de cambio forma en efecto un esquema en el que las réplicas que están sincronizando un esquema determinado deciden el orden de las unidades de cambio. Por ejemplo, las réplicas pueden decidir representar las propiedades de contacto de la forma siguiente:
Change Unit[0] = First Name
Change Unit[1] = Last Name
Change Unit[2] = Phone Number
Eliminar las unidades de cambio
La duración de una unidad de cambio está ligada a la duración del elemento. A diferencia de los elementos de cambio normales, las unidades de cambio no se pueden eliminar porque las réplicas han acordado que son propiedades de un elemento.
Agregar unidades de cambio
Los proveedores no deberían intentar crear unidades de cambio espontáneamente porque podrían producirse efectos no deseados.
Las unidades de cambio se pueden agregar dependiendo de las actualizaciones del esquema que se producen de forma oficiosa con una sincronización de los datos. Para ello, las unidades de cambio agregadas deben tener un valor null o un valor predeterminado que todas las réplicas asuman. La versión de la actualización para las unidades de cambio agregadas será entonces la versión de creación del elemento hasta que esas unidades de cambio se modifiquen. Al tratar las incorporaciones de unidades de cambio de esta manera, ante los componentes de la aplicación parece que no son diferentes de una unidad de cambio que existía desde el principio y que nunca se ha modificado.
Enumerar los cambios de las unidades de cambio
Cuando el proveedor de origen utiliza unidades de cambio para representar los subelementos que se enumeran en la réplica de origen, solo envía las unidades de cambio que cambiaron, en lugar de todo el elemento. Tenga en cuenta que cuando un elemento contiene unidades de cambio, la información de versión solo se mantiene para cada unidad de cambio y no para el propio elemento.
Enumerar los cambios de la unidad de cambio utilizando código administrado
Para determinar qué unidades de cambio enviar, el proveedor de origen utiliza el método Contains o Contains del objeto SyncKnowledge del proveedor de destino. Si un cambio de la unidad de cambio no está incluido en el conocimiento del destino, el cambio debe incluirse en el lote de cambios que el proveedor de origen envía.
Los cambios de la las unidades de cambio están contenidos dentro de los cambios de elementos que se agregan al lote de cambios. El objeto ItemChange se puede crear para contener los cambios de unidades de cambio utilizando el constructor ItemChange o los cambios de las unidades de cambio se pueden agregar mediante AddChangeUnitChange.
Enumerar los cambios de la unidad de cambio utilizando código no administrado
Para determinar qué unidades de cambio enviar, el proveedor de origen utiliza el método ISyncKnowledge::ContainsChangeUnit del objeto ISyncKnowledge del proveedor de destino. Si un cambio de una unidad de cambio no está incluido en el conocimiento del destino, debe incluirse en el lote de cambios que el proveedor de origen envía.
Los cambios de las unidades de cambio están contenidos dentro de los cambios de elementos que se agregan al lote de cambios. Para agregar los cambios de las unidades de cambio, especifique un valor que no sea NULL para el parámetro ppChangeBuilder del método ISyncChangeBatchBase::AddItemMetadataToGroup. El objeto ISyncChangeBuilder devuelto se puede utilizar a continuación para agregar los cambios de las unidades de cambio al cambio del elemento asociado utilizando ISyncChangeBuilder::AddChangeUnitMetadata.
Procesar los cambios de las unidades de cambio
Cuando el proveedor de destino utiliza un aplicador de cambios para ayudar a procesar un lote de cambios en su método IKnowledgeSyncProvider::ProcessChangeBatch (en el código administrado) o ProcessChangeBatch (en el código no administrado), el proveedor de destino enumera la información de versión del destino para cada cambio que se recibe del proveedor de origen. Cuando un cambio del origen contiene cambios de unidades de cambio, el proveedor de destino debe determinar qué versiones de las unidades de cambio, si las hay, se han de incluir en el lote de versiones de destino. Esta decisión depende de la clase de cambio del proveedor de origen y de si el elemento se ha marcado como eliminado en la réplica de destino. La tabla siguiente muestra qué información de versión debe enviar el proveedor de destino al aplicador de cambios.
|
El cambio de origen es una eliminación |
El cambio de origen es una actualización |
Se elimina el elemento de destino |
Solo la versión del elemento de destino. Las eliminaciones solo se permiten en elementos completos. Por consiguiente, la información de versión de una eliminación se somete a seguimiento para el elemento. |
Solo la versión del elemento de destino. Las eliminaciones solo se permiten en elementos completos. Por consiguiente, la información de versión de una eliminación se somete a seguimiento para el elemento. |
No se elimina el elemento de destino |
Todas las versiones de las unidades de cambio de destino. |
Solo las versiones de las unidades de cambio del destino para las unidades de cambio que se enumeran desde el origen. |
Tratar los conflictos que contienen unidades de cambio
Cuando una aplicación utiliza la resolución de conflictos personalizada para los cambios que contienen unidades de cambio, generalmente debe establecer la acción de resolución de conflictos para el conflicto de la unidad de cambio utilizando SetResolutionAction (en el código administrado) o IChangeConflict::SetResolveActionForChangeUnit (en el código no administrado).
Sin embargo, cuando una actualización produce el conflicto en una réplica y una eliminación lo produce en la otra réplica, la aplicación debe especificar la acción de resolución de conflictos para el conflicto del elemento utilizando SetResolutionAction (en el código administrado) o IChangeConflict::SetResolveActionForChange (en el código no administrado).
Aplicar los cambios de las unidades de cambio
Normalmente, cuando un cambio contiene unidades de cambio, Sync Framework llama a SaveChangeWithChangeUnits (en el código administrado) o a ISynchronousNotifyingChangeApplierTarget::SaveChangeWithChangeUnits (en el código no administrado) para aplicar el cambio en la réplica de destino. Sin embargo, cuando un conflicto se ha producido y se ha resuelto de modo que el elemento se elimina, Sync Framework llama a SaveItemChange (en el código administrado) o a ISynchronousNotifyingChangeApplierTarget::SaveChange (en el código no administrado). Esto se debe a que solo se pueden eliminar elementos completos y no unidades de cambio individuales.