단순 공급자의 메타데이터 관리
단순 공급자의 경우 Metadata Storage Service에 메타데이터를 저장해야 합니다. 이 작업은 SqlMetadataStore(관리 코드의 경우) 및 ISqlSyncMetadataStore(비관리 코드의 경우)에서 구현됩니다.
메타데이터 저장소에는 공급자 또는 응용 프로그램과 상호 작용하는 다음 형식의 메타데이터가 포함됩니다.
복제본 ID. 특정 저장소를 사용하는 복제본을 식별합니다.
항목 ID 및 버전. 항목 저장소에서 열거된 각 항목과 해당 항목의 현재 버전을 식별합니다.
변경 단위 ID 및 버전. 추적해야 하는 항목 부분과 각 부분의 현재 버전을 선택적으로 식별합니다. 예를 들어 연락처 데이터베이스의 연락처는 항목이 될 수 있고 전화 번호 필드는 변경 단위 중 하나가 될 수 있습니다.
항목 저장소 및 메타데이터 저장소의 항목 식별
항목을 동기화하려면 Sync Framework에서 항목 저장소의 항목을 식별하고 해당 ID를 메타데이터 저장소의 내부 ID에 매핑할 수 있어야 합니다. 또한 마지막 동기화 세션 이후로 항목 버전이 변경되었는지 여부를 확인할 수 있어야 합니다. 버전이 변경되었고 대상 복제본에 해당 버전의 항목이 포함되어 있지 않으면 항목을 동기화해야 합니다. 항목 대신 변경 단위 수준에서 변경 내용이 동기화되었으면 Sync Framework에서 변경 단위 및 해당 버전을 식별할 수 있어야 합니다. 변경 단위는 연락처를 나타내는 항목의 전화 번호 필드와 같은 하위 항목의 변경 내용을 나타냅니다. 이 샘플에서는 변경 단위를 사용하지 않습니다.
메타데이터 저장소 ID 형식 지정
다음 코드에서는 MyFullEnumerationSimpleSyncProvider
의 생성자 및 IdFormats 속성을 정의합니다. 이렇게 하면 Sync Framework Runtime에서 메타데이터 저장소 ID에 사용할 형식을 결정할 수 있습니다. 유연한 ID를 사용하지 않으면 Sync Framework에서 고정 형식을 사용하여 복제본, 항목 및 변경 단위를 식별합니다. 유연한 ID를 사용하면 ISimpleSyncProviderIdGenerator 메서드가 사용되어 ID가 생성됩니다.
public MyFullEnumerationSimpleSyncProvider(string name, MySimpleDataStore store)
{
_name = name;
_store = store;
// Create a file to store metadata for all items and a file to store
// the replica ID.
_replicaMetadataFile = Environment.CurrentDirectory + "\\" + _name.ToString() + ".Metadata";
_replicaIdFile = Environment.CurrentDirectory + "\\" + _name.ToString() + ".Replicaid";
// Set ReplicaIdFormat to use a GUID as an ID, and ItemIdFormat to use a GUID plus
// an 8-byte prefix.
_idFormats = new SyncIdFormatGroup();
_idFormats.ItemIdFormat.IsVariableLength = false;
_idFormats.ItemIdFormat.Length = 24;
_idFormats.ReplicaIdFormat.IsVariableLength = false;
_idFormats.ReplicaIdFormat.Length = 16;
this.ItemConstraint += new EventHandler<SimpleSyncItemConstraintEventArgs>(OnItemConstraint);
this.ItemConflicting += new EventHandler<SimpleSyncItemConflictingEventArgs>(OnItemConflicting);
}
public SyncId ReplicaId
{
get
{
if (_replicaId == null)
{
_replicaId = GetReplicaIdFromFile( _replicaIdFile);
}
return _replicaId;
}
}
public override SyncIdFormatGroup IdFormats
{
get { return _idFormats; }
}
Public Sub New(ByVal name As String, ByVal store As MySimpleDataStore)
_name = name
_store = store
' Create a file to store metadata for all items and a file to store
' the replica ID.
_replicaMetadataFile = (Environment.CurrentDirectory & "\") + _name.ToString() & ".Metadata"
_replicaIdFile = (Environment.CurrentDirectory & "\") + _name.ToString() & ".Replicaid"
' Set ReplicaIdFormat to use a GUID as an ID, and ItemIdFormat to use a GUID plus
' an 8-byte prefix.
_idFormats = New SyncIdFormatGroup()
_idFormats.ItemIdFormat.IsVariableLength = False
_idFormats.ItemIdFormat.Length = 24
_idFormats.ReplicaIdFormat.IsVariableLength = False
_idFormats.ReplicaIdFormat.Length = 16
AddHandler Me.ItemConstraint, AddressOf HandleItemConstraint
AddHandler Me.ItemConflicting, AddressOf HandleItemConflicting
End Sub
Public ReadOnly Property ReplicaId() As SyncId
Get
If _replicaId Is Nothing Then
_replicaId = GetReplicaIdFromFile(_replicaIdFile)
End If
Return _replicaId
End Get
End Property
Public Overrides ReadOnly Property IdFormats() As SyncIdFormatGroup
Get
Return _idFormats
End Get
End Property
항목 필드 및 메타데이터 스키마 지정
Sync Framework는 MetadataSchema 속성에 의해 노출되는 ItemMetadataSchema 개체를 사용하여 항목 저장소 데이터 또는 사용자가 만든 추가 메타데이터를 내부 메타데이터 저장소 ID 및 버전에 매핑합니다. 다음 코드 예제에서는 ItemMetadataSchema 개체에 대한 입력을 제공합니다. 예제 코드의 상수는 항목 저장소의 각 열에 대해 정수 값을 정의합니다. 이 값은 ItemMetadataSchema 개체의 사용자 지정 필드 정의 및 ID 규칙을 만들 때 사용됩니다.
public const uint CUSTOM_FIELD_ID = 1;
public const uint CUSTOM_FIELD_TIMESTAMP = 2;
public override ItemMetadataSchema MetadataSchema
{
get
{
CustomFieldDefinition[] customFields = new CustomFieldDefinition[2];
customFields[0] = new CustomFieldDefinition(CUSTOM_FIELD_ID, typeof(ulong));
customFields[1] = new CustomFieldDefinition(CUSTOM_FIELD_TIMESTAMP, typeof(ulong));
IdentityRule[] identityRule = new IdentityRule[1];
identityRule[0] = new IdentityRule(new uint[] { CUSTOM_FIELD_ID });
return new ItemMetadataSchema(customFields, identityRule);
}
}
Public Const CUSTOM_FIELD_ID As UInteger = 1
Public Const CUSTOM_FIELD_TIMESTAMP As UInteger = 2
Public Overrides ReadOnly Property MetadataSchema() As ItemMetadataSchema
Get
Dim customFields As CustomFieldDefinition() = New CustomFieldDefinition(1) {}
customFields(0) = New CustomFieldDefinition(CUSTOM_FIELD_ID, GetType(ULong))
customFields(1) = New CustomFieldDefinition(CUSTOM_FIELD_TIMESTAMP, GetType(ULong))
Dim identityRule As IdentityRule() = New IdentityRule(0) {}
identityRule(0) = New IdentityRule(New UInteger() {CUSTOM_FIELD_ID})
Return New ItemMetadataSchema(customFields, identityRule)
End Get
End Property
ItemMetadataSchema 개체는 다음과 같은 세 가지 속성을 노출합니다.
-
사용자 지정 필드는 정수로 식별되는 메타데이터 저장소의 필드입니다. 응용 프로그램에서 하나 이상의 필드에 대해 익숙한 이름이 필요하게 되면 정수를 이름에 매핑해야 합니다. 사용자 지정 필드를 정의하는 이유는 항목을 식별하고 이러한 항목에 대한 버전 정보를 제공하기 위해서입니다. 버전 필드를 사용하면 Sync Framework에서 항목 또는 변경 단위가 변경되었는지 여부를 확인할 수 있습니다. 이 예제에서는 버전 필드에 항목 저장소의 실제 데이터가 들어 있으므로 항목 저장소의 필드마다 필드가 하나씩 있습니다. 이 일대일 대응은 필수도 아니고 효율적이지도 않습니다. 보다 실용적인 해결책은 항목 필드의 해시를 가져와 단일 사용자 지정 필드에 저장하는 것입니다.
-
ID 규칙은 항목을 식별하는 데 사용할 사용자 지정 필드를 지정합니다. 이 경우
CUSTOM_FIELD_ID
필드(필드 0)가 사용됩니다. ChangeUnitVersionDefinitions(이 샘플에서는 사용되지 않음)
변경 단위가 사용되면 변경 단위에 대한 버전 필드를 정의해야 합니다. 변경 단위와 버전 정보 간에 일대일 매핑이 있어야 한다거나 실제 데이터가 저장되어 있어야 한다는 등의 요구 사항은 없습니다. 변경 단위는 여러 필드로 확장될 수도 있습니다. 예를 들어 이 응용 프로그램에서
Zip
및Phone
을 변경 단위로,Guid
를 다른 변경 단위로 지정할 수 있습니다.Guid
에 실제 데이터를 사용하고 다른 변경 단위에Zip
및Phone
필드의 해시 또는 다른 메커니즘을 사용하여 버전을 확인할 수 있습니다.
InsertItem 같이 항목 저장소 데이터에 사용되는 몇 가지 메서드에는 각 필드를 나타내는 ItemField 개체의 모음이 필요합니다. 이러한 메서드에 대한 매개 변수인 ItemFieldDictionary 개체는 CustomFieldDefinition 개체에 지정된 것과 동일한 인덱스 값을 갖습니다.