Synchronisieren von Änderungseinheiten
Eine Änderungseinheit entspricht einer Änderung eines Unterelements, wie zum Beispiel einem Feld für Telefonnummern in einem Element, das eine Visitenkarte darstellt. Mit Änderungseinheiten können Anbieter Änderungen an Unterelementen effizienter synchronisieren. Einige Beispiele für Anbieter, die Änderungseinheiten zu ihrem Vorteil nutzen können, sind Anbieter von Personal Information Managern (PIM) und Anbieter, die mit ihren Metadaten Bilder verarbeiten.
Änderungseinheiten
Änderungseinheiten ermöglichen die Darstellung kompakter Änderungen an Unterelementen. Dadurch wird die Änderungsverfolgung verfeinert. Dies kann die Anzahl von Konflikten reduzieren, die bei Änderungen an einem Element ausgelöst werden.
Betrachten wir ein Element, das eine Visitenkarte in einem Dateisystem darstellt. Wenn die Auflösung der Änderungsverfolgung auf der Ebene des Elements (der Datei) stattfinden würde, wäre jede Änderung an der Datei eine Elementänderung, und alle Kontaktdaten müssten übertragen werden. Stattdessen hat der Anbieter durch Änderungseinheiten die Möglichkeit, die Änderungen auf der Eigenschaftsebene des Kontakts zu ermitteln, und dort auftretende Konflikte in einzelnen Einheiten, wie Vorname, Nachname und Telefonnummer zu lösen. In diesem Fall können zwei Replikate unabhängig voneinander verschiedene Eigenschaften wie die E-Mail-Adresse oder das Bild eines Kontakts ändern, ohne dass ein Konflikt auf Elementebene ausgelöst wird. Hierbei müssen nur die Daten der Änderungseinheiten gesendet werden.
Die Menge der Änderungseinheiten bildet im Grunde ein Schema, in dem von den Replikaten, die ein bestimmtes Schema synchronisieren, über die Reihenfolge der Änderungseinheiten entschieden wird. Beispielsweise können Replikate Kontakteigenschaften folgendermaßen darstellen:
Change Unit[0] = First Name
Change Unit[1] = Last Name
Change Unit[2] = Phone Number
Löschen von Änderungseinheiten
Die Dauer einer Änderungseinheit ist an die Dauer des Elements gebunden. Im Unterschied zu normalen Änderungselementen können Änderungseinheiten nicht gelöscht werden, da die Replikate vereinbart haben, dass es sich um Eigenschaften eines Elements handelt.
Hinzufügen von Änderungseinheiten
Änderungseinheiten sollten nicht spontan von Anbietern erstellt werden, da dies zu unerwünschten Auswirkungen führen kann.
Änderungseinheiten können im Rahmen von Schemaaktualisierungen, die Out-of-band mit einer Synchronisierung der Daten stattfinden, hinzugefügt werden. Hierfür müssen die hinzugefügten Änderungseinheiten einen null-Wert oder einen Standardwert haben, von dem alle Replikate ausgehen. Die Aktualisierungsversion der hinzugefügten Änderungseinheiten wird dann zur Erstellungsversion des Elements, bis diese Änderungseinheiten geändert werden. Wenn Änderungseinheiten auf diese Art behandelt werden, interpretieren die Anwendungskomponenten sie genauso wie unveränderte Änderungseinheiten, die es von Anfang an gab.
Auflisten von Änderungen an Änderungseinheiten
Wenn der Quellenanbieter Änderungseinheiten verwendet, um aufgelistete Unterelemente aus dem Quellreplikat darzustellen, werden anstatt des gesamten Elements nur die geänderten Änderungseinheiten gesendet. Beachten Sie, dass die Versionsinformationen eines Elements mit Änderungseinheiten nur für jede Änderungseinheit, nicht jedoch für das Element selbst beibehalten wird.
Auflisten von Änderungen an Änderungseinheiten mit verwaltetem Code
Zum Festlegen der zu sendenden Änderungseinheiten verwendet der Quellenanbieter die Contains-Methode oder die Contains-Methode des SyncKnowledge-Objekts vom Zielanbieter. Wenn eine Änderung an der Änderungseinheit nicht im Zielwissen vorhanden ist, muss die Änderung in einem vom Quellenanbieter gesendeten Änderungsbatch einbezogen werden.
Änderungen an Änderungseinheiten sind in Elementänderungen enthalten, die dem Änderungsbatch hinzugefügt werden. Das ItemChange-Objekt kann mithilfe des ItemChange-Konstruktors so erstellt werden, dass es Änderungen an Änderungseinheiten enthält. Änderungen an Änderungseinheiten können auch mit AddChangeUnitChange hinzugefügt werden.
Auflisten von Änderungen an Änderungseinheiten mit nicht verwaltetem Code
Zum Festlegen der zu sendenden Änderungseinheiten verwendet der Quellenanbieter die ISyncKnowledge::ContainsChangeUnit-Methode des ISyncKnowledge-Objekts vom Zielanbieter. Wenn eine Änderung an der Änderungseinheit nicht im Zielwissen vorhanden ist, muss die Änderung in einem vom Quellenanbieter gesendeten Änderungsbatch einbezogen werden.
Änderungen an Änderungseinheiten sind in Elementänderungen enthalten, die dem Änderungsbatch hinzugefügt werden. Um Änderungen an Änderungseinheiten hinzuzufügen, geben Sie einen nicht-NULL-Wert für den ppChangeBuilder-Parameter der ISyncChangeBatchBase::AddItemMetadataToGroup-Methode an. Das zurückgegebene ISyncChangeBuilder-Objekt kann anschließend verwendet werden, um der zugeordneten Elementänderung mithilfe von ISyncChangeBuilder::AddChangeUnitMetadata Änderungen an Änderungselementen hinzuzufügen.
Verarbeiten von Änderungen an Änderungseinheiten
Wenn der Zielanbieter für die Verarbeitung des Änderungsbatches in der ProcessChangeBatch-Methode (für verwalteten Code) oder in der IKnowledgeSyncProvider::ProcessChangeBatch-Methode (für nicht verwalteten Code) einen Änderungsanwender verwendet, listet der Zielanbieter die Informationen der Zielversion für jede vom Quellenanbieter empfangene Änderung auf. Wenn eine Quelländerung Änderungen an Änderungseinheiten enthält, muss vom Zielanbieter festgestellt werden, welche Änderungseinheitsversionen im Batch mit den Zielversionen enthalten sein sollen. Diese Entscheidung hängt sowohl vom Änderungstyp des Quellenanbieters als auch davon ab, ob das Element im Zielreplikat als gelöscht markiert ist. In der folgenden Tabelle wird dargestellt, welche Versionsinformationen der Zielanbieter an den Änderungsanwender senden muss.
|
Quelländerung ist ein Löschvorgang. |
Quelländerung ist eine Aktualisierung. |
Zielelement wird gelöscht. |
Nur die Zielelementversion. Löschvorgänge sind nur für ganze Elemente zulässig. Versionsinformationen für einen Löschvorgang werden daher für das Element verfolgt. |
Nur die Zielelementversion. Löschvorgänge sind nur für ganze Elemente zulässig. Versionsinformationen für einen Löschvorgang werden daher für das Element verfolgt. |
Das Zielelement wird nicht gelöscht. |
Alle Versionen der Zieländerungseinheit. |
Versionen der Zieländerungseinheit nur für die Änderungseinheiten, die von der Quelle aufgelistet werden. |
Behandlung von Konflikten bei Änderungseinheiten
Wenn in einer Anwendung eine benutzerdefinierte Konfliktauflösung für Änderungen mit Änderungseinheiten verwendet wird, muss die Konfliktlösungsaktion für den Änderungseinheitenkonflikt im Allgemeinen mit der SetResolutionAction-Methode (für verwalteten Code) oder der IChangeConflict::SetResolveActionForChangeUnit-Methode (für nicht verwalteten Code) festgelegt werden.
Wenn der Konflikt allerdings durch eine Aktualisierung in einem Replikat und einen Löschvorgang im anderen Replikat ausgelöst wird, muss die Konfliktlösungsaktion für den Elementkonflikt in der Anwendung durch SetResolutionAction (für verwalteten Code) oder IChangeConflict::SetResolveActionForChange (für nicht verwalteten Code) angegeben werden.
Übernehmen von Änderungen an Änderungseinheiten
Wenn eine Änderung Änderungseinheiten enthält, ruft Sync Framework in der Regel die SaveChangeWithChangeUnits-Methode (für verwalteten Code) oder die ISynchronousNotifyingChangeApplierTarget::SaveChangeWithChangeUnits-Methode (für nicht verwalteten Code) auf, um die Änderung auf das Zielreplikat anzuwenden. Wenn jedoch ein Konflikt aufgetreten ist, der durch das Löschen des Elements gelöst wurde, ruft Sync Framework die SaveItemChange-Methode (für verwalteten Code) oder die ISynchronousNotifyingChangeApplierTarget::SaveChange-Methode (für nicht verwalteten Code) auf. Der Grund hierfür ist, dass nur ganze Elemente gelöscht werden können, nicht einzelne Änderungseinheiten.